现有线程分析
每个客户端都有读写两个线程,加上selector的线程以及转发、等待连接线程等,可见线程是非常多的。
线程优化后的模型
- 减少线程数量,每个客户端不再开读和写线程,而是开整体的读线程池和写线程池。
- ByteBuffer也不再为每个客户端都开辟一个,而是使用统一的ByteBuffer。
- 异步线程采用锁(AtomicBoolean)实现数据同步
运行环境
IDEA
目录结构
- 多模块项目
-
lib-clink --工具包
core --核心类包
Connector --客户端连接类
IoArgs --Buffer封装类
IoContext --上下文类,统筹
IoProvider --IO方法接口,即数据收发方法接口
Receive --接收接口
Sender --发送接口
utils --基本工具包
ByteUtils --byte数据的工具类
CloseUtils --关闭操作工具类
Impl --方法使用接口包
IoSelectorProvider --IoProvider的实现类
SocketChannelAdapter --数据收发具体实现类
Clink --clink总类
-
sample-client --客户端
bean --数据格式封装包
ServerInfo --服务器信息封装类
Client --客户端启动总类
TCPClient --TCP数据发送类
UDPSearcher --UDP搜索类
-
sample-foo --协议包
constants --协议规定包
TCPConstants --TCP协议规定端口等
UDPConstants --UDP协议规定端口等
-
sample-server --服务端
handle
ClientHandler --客户端线程类
Server --服务器启动总类
TCPServer --TCP服务端
UDPProvider --UDP接收广播回送消息类
代码
注释也在里边了
链接: 百度网盘 提取码: yb3b
不足
- 消息粘包的问题没有解决,因为缓冲区长度固定,超出部分则容易出现问题
- 所以客户端发送消息代码没有改写,客户端连接等没有改写
- 在下篇会给出完整的ChatRoom改写代码