TCP编程
要求
- 请编写一个群聊的程序,包括服务端程序和客户端程序。
- 服务端功能:收到某客户端的信息,将消息在控制台输出,然后,发给其他另外的客户端。
- 客户端功能:每隔5秒发送一条信息给服务端。然后接收服务器转发过来的消息,并在控制台输出。
客户端
- 由于每隔5秒发送一条信息给服务端,所以考虑采用串行结构,每隔五秒发送固定字符,再进行读取
- 也可以采用多线程,一个线程负责读取,一个线程负责发送
- 由于DataOutputStream需要关闭流才能进行发送,而一旦关闭了流也就关闭了Socket,会抛出Socket is closed异常,所以采用PrintWriter而非DataOutputStream,服务端同理
1 | import java.io.*; |
服务端
- 服务端相比于客户端更为复杂,首先考虑使用线程池来进行多个Client连接
- 为了实现群发效果,需要使用List记录当前处于连接状态的所有Socket,在群发过程中进行逐个遍历,同时更新List去除失去连接的Socket,使用CopyOnWriteArrayList防止线程不同步
1 | import java.io.*; |
NIO编程
要求
- 请基于NIO(第6章第六节的NIO,非AIO)编写一个群聊的程序,包括服务端程序和客户端程序。
- 服务端功能:只用一个线程,收到某客户端的信息,将消息在控制台输出,然后,发给其他另外的客户端。
- 客户端功能:每隔5秒发送一条信息给服务端。然后接收服务器转发过来的消息,并在控制台输出。
客户端
- 和TCP编程不同,客户端的Selector轮询需要不停地进行,而发送消息需要每隔5秒进行,无法进行串行编写,所以需要创建一个新线程进行发送消息
1 | import java.io.IOException; |
服务端
- 和客户端类似,故不再赘述
1 | import java.io.IOException; |