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

时间:2021-12-29 06:05:49

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

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

服务端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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();
      }
    }
  }
}

客户端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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();
      }
    }
  }
}

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

原文链接:http://blog.csdn.net/zlqqhs/article/details/8757250