# nettyPro **Repository Path**: jk2015/netty-pro ## Basic Information - **Project Name**: nettyPro - **Description**: 一个完备的Netty客户端. 一个完备的多人聊天室 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-06-25 - **Last Updated**: 2023-07-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### Netty Client——一个完备的Netty客户端. #### 一个完备的多人聊天室 ##### 实现的功能: - [x] 1,点击上线,就可以接收和发送消息。用户名称唯一,通过名称确定唯一用户。 - [x] 2,发送消息,分为一对一发送,和广播发送。 - [x] 3,可以点击下线,下线不接收消息 ##### 1、实现功能 - [x] 心跳机制——链路保活,服务端下线,客户端不下线,等待服务器端重新上线,客户端自动链接 - [x] 重连机制 - [ ] 协议编解码通用基类——模板方法定制编解码主流程 - [ ] 加解密 ##### 2、影响Netty客户端IO性能的参数 ###### Netty对外提供的TCP参数 * SO_KEEPALIVE:是否启用TCP层keepalive机制。keepalive心跳包的发送与操作系统3个系统参数有关,可修改它们进行验证: >linux (/proc/sys/net/ipv4/) > >* tcp_keepalive_time:心跳包间隔,秒 >* tcp_keepalive_intvl:心跳包重试间隔,秒 >* tcp_keepalive_probes:最大重试次数,重发n次后仍未收到对端回复,则认定连接已经失效。TCP的读取操作,将返回0 >win下(注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\\): > >* KeepAliveTime:REG_DWORD,ms >* KeepAliveInterval:REG_DWORD,s >* TcpMaxDataRetransmissions:REG_DWORD * SO_TIMEOUT:socket读超时时长,单位毫秒ms。SO_TIMEOUT=0,表示一直阻塞直到有数据到来 * CONNECT_TIMEOUT_MILLIS:客户端连接超时时长。TCP连接过程超时则程序抛异常 * SO_SNDBUF:socket发送缓冲区大小 * SO_RCVBUF:socket接收缓冲区大小 * SO_REUSEADDR:是否允许socket重用。若服务程序停止后想立即重启,而新socket依旧使用相同IP端口(创建客户端socket时绑定了本地IP端口),此时 `SO_REUSEADDR `选项非常有用。 此套接字选项通知内核,如果端口忙,但TCP状态位于` TIME_WAIT` ,可以重用端口。如果端口忙,而TCP状态位于其他状态,重用端口时依旧得到一个错误信息,指明"地址已被使用"。 一个socket套接字由相关五元组构成,协议、本地地址、本地端口、远程地址、远程端口。`SO_REUSEADDR` 仅仅表示可以重用本地地址、本地端口,整个相关五元组还是唯一确定的。所以,重启后的服务程序有可能收到非期望数据。 必须慎重使用 SO_REUSEADDR 选项 * TCP_NODELAY:`no_delay`,禁止延迟的意思。激活或禁止`TCP_NODELAY`套接字选项,它将决定是否使用Nagle算法。 Nagle算法是TCP协议中一种将多个小包组装成大包发送的算法机制,以减少网络环境中小包数量,但在“聚小”的过程中也引入了一定的数据收发延迟。 时延敏感型应用,建议关闭Nagle算法,即:设置`TCP_NODELAY = true`