[size=medium][color=red][b] 多线程 和 Socket 的使用介绍
[/b][/color][/size]
[size=small][color=olive][b]
1、产生背景:

实际应用中的客户端可能需要和服务器保持长时间的通信,即服务器需要不断的读取客户端数据,并向客户端写入数据,客户端也需要不断读取服务器数据,并向服务器写入数据;

使用传统的BufferedReader 的readLine 方法读取数据时,在该方法成功返回之前线程被阻塞,程序无法继续执行。基于这个原因,服务器应该为每个Socket 单独启动一条线程,每条线程负责与一个客户端进行通信。


2、案例分析:实现一个简单 C/S 聊天室为例:实现多个客户端通信

项目分析:

因为服务器读啊应该包含多条线程,每个Socket对应一条线程,该线程负责读取Socket对应输入流的数据(从客户端发送来的数据),并将读取到的数据向每个Socket输出来发送一遍(即将一个客户端发送的数据广播给其他的客户端),因此需要在服务器端使用List来保存所有的Socket.

实现步骤:
(1)、定义保存所有Socket 的集合;
(2)、创建ServerSocket 监听;
(3)、采用循环不断接收来自客户端的连接请求;
(4)、将接收客户端请求产生的Socket添加到集合中;
(5)、客户端连接后启动一条线程为该客户服务;

编写服务器端的线程类:

服务器端的线程类不断读取客户的数据,在此声明一个方法来读取客户端的数据,当服务器线程类读取到客户端的数据之后,程序便利Socket 集合,并将该数据向集合中的每一个Socket 发送一次。如果读取数据的过程捕获了异常,那么说明该Socket对应的客户端Socket 出现了问题,程序就将该Socket 从集合合删除;


客户端的实现:

每个客户端包含两条线程:一条负责生成主界面,并响应用户动作,并将输入的数据(从服务器发送过来的数据),并负责将这些数据在主程序界面上显示处理。