Java--Socket通信(客户端服务端双向)

 更新时间:2017年01月20日 11:13:04   作者:zlQ_  
这篇文章主要介绍了Java--Socket通信(客户端服务端双向),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

新建两个工程,一个客户端,一个服务端,先启动服务端再启动客户端

两个工程的读写操作线程类基本上完全相同

服务端:

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 
 
public class Server { 
 
  public static final int PORT = 8000;//监听的端口号   
 
  public static void main(String[] args) {  
    Server server = new Server();  
    server.init();  
  }  
 
  public void init() {  
    ServerSocket serverSocket = null; 
    try {  
      serverSocket = new ServerSocket(PORT);  
      while (true) {  
        Socket client = serverSocket.accept();  
        //一个客户端连接就开户两个线程处理读写  
        new Thread(new ReadHandlerThread(client)).start();  
        new Thread(new WriteHandlerThread(client)).start();  
      }  
    } catch (Exception e) {  
      e.printStackTrace();  
    } finally{ 
      try { 
        if(serverSocket != null){ 
          serverSocket.close(); 
        } 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  }  
}  
 
/* 
 *处理读操作的线程  
 */ 
class ReadHandlerThread implements Runnable{ 
  private Socket client; 
 
  public ReadHandlerThread(Socket client) { 
    this.client = client; 
  } 
 
  @Override 
  public void run() { 
    DataInputStream dis = null; 
    try{ 
      while(true){ 
        //读取客户端数据  
        dis = new DataInputStream(client.getInputStream()); 
        String reciver = dis.readUTF(); 
        System.out.println("客户端发过来的内容:" + reciver);  
      } 
    }catch(Exception e){ 
      e.printStackTrace(); 
    }finally{ 
      try { 
        if(dis != null){ 
          dis.close(); 
        } 
        if(client != null){ 
          client = null; 
        } 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
} 
 
/* 
 * 处理写操作的线程 
 */ 
class WriteHandlerThread implements Runnable{ 
  private Socket client; 
 
  public WriteHandlerThread(Socket client) { 
    this.client = client; 
  } 
 
  @Override 
  public void run() { 
    DataOutputStream dos = null; 
    BufferedReader br = null; 
    try{ 
      while(true){ 
        //向客户端回复信息  
        dos = new DataOutputStream(client.getOutputStream());  
        System.out.print("请输入:\t");  
        // 键盘录入  
        br = new BufferedReader(new InputStreamReader(System.in)); 
        String send = br.readLine();  
        //发送数据 
        dos.writeUTF(send);  
      } 
    }catch(Exception e){ 
      e.printStackTrace(); 
    }finally{ 
      try { 
        if(dos != null){ 
          dos.close(); 
        } 
        if(br != null){ 
          br.close(); 
        } 
        if(client != null){ 
          client = null; 
        } 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
} 

客户端:

import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 
 
public class Client { 
 
  public static final String IP = "localhost";//服务器地址  
  public static final int PORT = 8000;//服务器端口号  
 
  public static void main(String[] args) {  
    handler();  
  } 
 
  private static void handler(){ 
    try { 
      //实例化一个Socket,并指定服务器地址和端口 
      Socket client = new Socket(IP, PORT); 
      //开启两个线程,一个负责读,一个负责写 
      new Thread(new ReadHandlerThread(client)).start(); 
      new Thread(new WriteHandlerThread(client)).start(); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
}  
 
/* 
 *处理读操作的线程  
 */ 
class ReadHandlerThread implements Runnable{ 
  private Socket client; 
 
  public ReadHandlerThread(Socket client) { 
    this.client = client; 
  } 
 
  @Override 
  public void run() { 
    DataInputStream dis = null; 
    try { 
      while(true){ 
        //读取服务器端数据  
        dis = new DataInputStream(client.getInputStream()); 
        String receive = dis.readUTF();   
        System.out.println("服务器端返回过来的是: " + receive);  
      } 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } finally{ 
      try { 
        if(dis != null){ 
          dis.close(); 
        } 
        if(client != null){ 
          client = null; 
        } 
      } catch (IOException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
} 
 
/* 
 * 处理写操作的线程 
 */ 
class WriteHandlerThread implements Runnable{ 
  private Socket client; 
 
  public WriteHandlerThread(Socket client) { 
    this.client = client; 
  } 
 
  @Override 
  public void run() { 
    DataOutputStream dos = null; 
    BufferedReader br = null; 
    try { 
      while(true){ 
        //取得输出流 
        dos = new DataOutputStream(client.getOutputStream()); 
        System.out.print("请输入: \t");  
        //键盘录入 
        br = new BufferedReader(new InputStreamReader(System.in)); 
        String send = br.readLine();  
        //发送数据 
        dos.writeUTF(send);  
      } 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } finally{ 
      try{ 
        if(dos != null){ 
          dos.close(); 
        } 
        if(br != null){ 
          br.close(); 
        } 
        if(client != null){ 
          client = null; 
        } 
      }catch(Exception e){ 
        e.printStackTrace(); 
      } 
    } 
  } 
} 

 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 浅谈Java中BIO、NIO和AIO的区别和应用场景

    浅谈Java中BIO、NIO和AIO的区别和应用场景

    这篇文章主要介绍了Java中BIO、NIO和AIO的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • spring boot 枚举使用的坑整理

    spring boot 枚举使用的坑整理

    在本篇文章里我们给大家整理了关于spring boot 枚举使用的坑以及相关知识点内容,需要的朋友们学习下。
    2019-08-08
  • 分享一个简单的java爬虫框架

    分享一个简单的java爬虫框架

    这篇文章主要介绍了分享一个简单的java爬虫框架,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 出现log.info报红的解决方案

    出现log.info报红的解决方案

    这篇文章主要介绍了出现log.info报红的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 利用Spring Validation实现输入验证功能

    利用Spring Validation实现输入验证功能

    这篇文章主要给大家介绍了如何利用Spring Validation完美的实现输入验证功能,文中有详细的代码示例,具有一定的参考价值,感兴趣的朋友可以借鉴一下
    2023-06-06
  • 已有的springcloud+mybatis项目升级为mybatis-plus的方法

    已有的springcloud+mybatis项目升级为mybatis-plus的方法

    这篇文章主要介绍了已有的springcloud+mybatis项目升级为mybatis-plus,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java Stream排序的实现方式面试精讲

    Java Stream排序的实现方式面试精讲

    这篇文章主要为大家介绍了Java Stream排序的实现方式面试精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 详解Java 加密解密和数字签名问题

    详解Java 加密解密和数字签名问题

    在做项目中,只要涉及敏感信息,或者对安全有一定要求的场景,都需要对数据进行加密。接下来通过本文给大家分享Java 加密解密和数字签名问题,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • 在springboot中如何给mybatis加拦截器

    在springboot中如何给mybatis加拦截器

    这篇文章主要介绍了在springboot中如何给mybatis加拦截器,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • SpringBoot实现前端验证码图片生成和校验

    SpringBoot实现前端验证码图片生成和校验

    这篇文章主要为大家详细介绍了SpringBoot实现前端验证码图片生成和校验,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论