客户端连上服务端。
如果客户端遇到死机,路由器坏了,断开连接,服务端不是能感知到吗?在ChannelInboundHandlerAdapter 的exceptionCause方法里会触发一次消息说“远程断开连接”,这个时候服务端把ctx.close()掉连接不就行了。
既然能感知,那么为什么还需要利用IdleStateHandler实现心跳机制(单位时间内没发送数据给服务端就要发一个心跳数据包)?
英雄联盟里检测客户端玩家是否有挂机的 话,就是要看客户端是不是在单位时间内没发数据,如果是就关闭连接。那如果弄了心跳机制(会定时的发一下数据给服务端),那样就检测不出是不是玩家挂机了。
你说的所谓“感知”那是 Socket 中断了。
但事实上首先 Client 死掉了并不一定是因为 Socket 中断;其次就算是 Socket 中断,但是否中断完全取决于客户端与服务端的连接设置,从 TCP 协议的层面上并不能实时地感知到连接中断了,往往要等到超时一段时间收才会知道;最后传输层本身的设计问题以及网络拓扑结构的复杂性,导致客户端也不能事实知道服务端挂了,心跳不只是让服务端知道客户端还活着,也是客户端嗅探服务端是否健在的手段,二者是双向的。
至于你最后举的例子,与 Netty 无关。
P.S. 心跳包和用户行为的数据包还能长的一样吗?