java线程之二 多线程

单线程开发模式中。如果一个客户端没有与客户端断开连接,则其他的客户端就必须

一直等待。多线程则允许多个客户端同时连接服务端,而不需要等待其他客户端断开后

才可以连接,也就是通常所说的非阻塞通信。

服务端

 1 /**
 2  * @author  draem0507@gmail.com
 3  * @TODO    java线程开发之二 多线程
 4  * @version 1.0
 5  * @date 2013-5-7下午09:19:45    
 6  * @blgos http://www.cnblogs.com/draem0507
 7  */
 8 
 9 
10  class ServerTest {
11     private ServerSocket serverSocket;
12 
13     
14 
15     public ServerTest() {
16         try {
17             serverSocket = new ServerSocket(10000);
18             // 开启无限循环 创建每个客户端的socket线程
19             while (true) {
20                 Socket socket = serverSocket.accept();
21                 new ReceiveSocket(socket).start();
22             }
23         } catch (IOException e) {
24             // TODO Auto-generated catch block
25             e.printStackTrace();
26         }
27 
28     }
29 
30     public static void main(String[] args) {
31         new ServerTest();
32 
33     }
34 
35     private class ReceiveSocket extends Thread {
36         private Socket socket;
37 
38         public ReceiveSocket(Socket socket) {
39             this.socket = socket;
40         }
41 
42         private BufferedReader reader;
43         private PrintWriter writer;
44 
45         @Override
46         public void run() {
47 
48             try {
49                 reader = new BufferedReader(new InputStreamReader(socket
50                         .getInputStream()));
51                 writer = new PrintWriter(socket.getOutputStream(), true);
52                 // 开启无限循环 监控消息
53                 while (true) {
54                     String msg = reader.readLine();
55                     System.out.println("客户端对你说:" + msg);
56                     // write(msg)+write("\r")==println() 具体请参考PrintWriter源码
57                     writer.write("服务端收到客户端发送的信息:" + msg);
58                     writer.println();
59                     while (msg.equals("bye")) {
60                         break;
61                     }
62                 }
63 
64             } catch (IOException e) {
65                 // TODO Auto-generated catch block
66                 e.printStackTrace();
67             } finally {
68                 if (null != reader) {
69                     try {
70                         reader.close();
71                     } catch (IOException e) {
72                         // TODO Auto-generated catch block
73                         e.printStackTrace();
74                     }
75                 }
76                 if (null != writer) {
77                     try {
78                         reader.close();
79                     } catch (IOException e) {
80                         // TODO Auto-generated catch block
81                         e.printStackTrace();
82                     }
83                 }
84                 try {
85                     socket.close();
86                 } catch (IOException e) {
87                     // TODO Auto-generated catch block
88                     e.printStackTrace();
89                 }
90             }
91 
92         }
93 
94     }
95 
96 }

客户端

 1 public class ClientTest {
 2     public static void main(String[] args) throws Exception {
 3         Socket socket = new Socket("localhost", 10000);
 4         BufferedReader in = new BufferedReader(new InputStreamReader(socket
 5                 .getInputStream()));
 6         PrintWriter out = new PrintWriter(socket.getOutputStream());
 7         BufferedReader reader = new BufferedReader(new InputStreamReader(
 8                 System.in));
 9 
10         while (true) {
11             String msg = reader.readLine();
12             out.println(msg);
13             out.flush();
14             if (msg.equals("bye")) {
15                 break;
16             }
17             System.out.println(in.readLine());
18         }
19         socket.close();
20     }
21 }

运行服务端后,可以多次运行客户端,并且之间的通信是互不干扰。

顺便提个问题,如果实现客户端与客户端的通信 及其服务端如何群发信息给客户端,感兴趣的朋友可以去研究下。

原文地址:https://www.cnblogs.com/draem0507/p/3066463.html