创建多人聊天室:
使用的是 阻塞式模型,这里只涉及多人聊天,不涉及 一对一聊天,使用了多线程.
接收数据时:要将换行符丢弃。
2台以上设备如何交互数据?
1.约定一个基础的数据格式:使用回车换行符作为信息的截断。
2. 客户端 - 服务器 - 转发到 客户端 【三者及以上,用户1 发送信息到服务器,服务器遍历其他的客户端,将该消息通知到其他客户端上】
1.客户端:
首先使用 UDP 广播,获取 tcp 服务器的端口号和IP地址,
然后进行 tcp 的 客户端 和 服务器的连接
在 TCPClient 中 只有一个读线程,没有写线程()
写是在 client 类中进行的
2.对 tcp服务端 类的分析:
2.1 : server类【充当一个窗口】: 负责 启动 TCPServer 和 UDPProvider 类,并且 将 从键盘传入的信息转发给 已连接的客户端。
2.2: TCPServer 类:
1. start 函数:启动 对客户端进行监听的类:ClientListener
2.: ClientListener【多线程类】:使用 do-while 循环 监听客户端的连接。
每有一个客户端连接,就构建一个异步线程ClientHandler。
server.accept(); 是阻塞式的,即若没有客户端连接,就一直阻塞在这里
3 : ClientHandler:真正对客户端的消息的读写进行处理 :
首先明确的是:客户端的读写是分离的 ,互不干扰(即读一个线程,写一个线程)
这是一个读线程
但是 对于写线程来说【对客户端消息的转发】:(
这里没有让 ClientWriteHandler 继承 Thread , 是因为 继承了Thread,对于写线程来说, 大部分时间都在等待,
但是实现该等待是比较复杂的,这涉及到了 多线程的协作问题, 所以就设置成了 单线程池)
服务器性能分析:
服务器需要GC回收 和主线程(这就两条了)
监听客户端的连接,
转发客户端信息也使用了一个单线程池
所以服务器的实际线程数量至少是:2n+4
进行了一下客户端压测:能承受1000个左右,消耗90多M的内存和50的cpu量
和2000多个线程