码迷,mamicode.com
首页 > 编程语言 > 详细

Java Socket 多人聊天室实现

时间:2015-09-24 11:00:35      阅读:507      评论:0      收藏:0      [点我收藏+]

标签:

实现功能

服务器端:

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 }
Listen Clients

服务器转发消息到所有客户端:

技术分享
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 }
Send Clients

客户端监听服务器端返回的消息:

技术分享
 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 }
Receive Server

客户端向服务器发送消息:

技术分享
 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 }
Send Server

测试

启动一个服务端,两个客户端,效果如下:

技术分享 

 技术分享

 

完整代码路径:https://github.com/vicis-zyzy/SocketDemo

Java Socket 多人聊天室实现

标签:

原文地址:http://www.cnblogs.com/vicis/p/4834318.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!