标签:
服务器端:
1、服务器可以监听多个Socket连接。
2、服务器将收到的消息转发到所有Socket连接上。
客户端:
1、客户端实时监听来自服务器的消息。
2、客户端随时可以向服务器发送消息。
服务器通过循环等待的方式实现监听多个连接,每次启用新的线程处理连接,连接建立后加到一个List中保存,每次收到消息时都遍历数组转发消息,达到向所有客户端广播的目的。
客户端使用两个线程处理,一个线程负责实时收信息,一个线程负责实时发送信息。
服务器多线程监听客户端连接:
1 try { 2 while (true) { 3 // accept()将阻塞线程 4 Socket socket = serverSocket.accept(); 5 6 // 保存连接 7 sockets.add(socket); 8 9 // 启用新线程处理 10 new Thread(new HandlerConnection(socket, sockets)).start(); 11 } 12 } catch (Exception e) { 13 System.out.println("connect client failed:" + e.toString()); 14 }
服务器转发消息到所有客户端:
1 PrintWriter printWriter; 2 try { 3 for (Socket socket : sockets) { 4 printWriter = new PrintWriter(socket.getOutputStream(), true); 5 printWriter.println(message); 6 } 7 } catch (Exception e) { 8 System.out.println("[sendToClients]" + e.toString()); 9 }
客户端监听服务器端返回的消息:
1 public void run() { 2 BufferedReader reader; 3 try { 4 reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 5 while (true) { 6 Thread.sleep(10); 7 System.out.println(reader.readLine()); 8 } 9 } catch (Exception e) { 10 System.out.println("[Receive message failed]" + e.toString()); 11 } 12 }
客户端向服务器发送消息:
1 public void run() { 2 Scanner scanner = null; 3 PrintWriter printWriter = null; 4 try { 5 scanner = new Scanner(System.in); 6 printWriter = new PrintWriter(socket.getOutputStream(), true/*auto flush*/); 7 8 Boolean eof = false; 9 while (!eof && scanner.hasNext()) { 10 String message = scanner.nextLine(); 11 printWriter.println("Client-1: " + message); 12 if (QUIT.equals(message.trim())) { 13 eof = true; 14 } 15 } 16 } catch (IOException e) { 17 System.out.println("[Send message failed]" + e.toString()); 18 } finally { 19 // close resource 20 if (null != scanner) { 21 scanner.close(); 22 } 23 if (null != printWriter) { 24 printWriter.close(); 25 } 26 try { 27 socket.close(); 28 } catch (IOException e) { 29 System.out.println("[Close client socket failed]" + e.toString()); 30 } 31 } 32 }
启动一个服务端,两个客户端,效果如下:
完整代码路径:https://github.com/vicis-zyzy/SocketDemo
标签:
原文地址:http://www.cnblogs.com/vicis/p/4834318.html