netty为什么要实现心跳机制

客户端连上服务端。
如果客户端遇到死机,路由器坏了,断开连接,服务端不是能感知到吗?在ChannelInboundHandlerAdapter 的exceptionCause方法里会触发一次消息说“远程断开连接”,这个时候服务端把ctx.close()掉连接不就行了。

既然能感知,那么为什么还需要利用IdleStateHandler实现心跳机制(单位时间内没发送数据给服务端就要发一个心跳数据包)?

英雄联盟里检测客户端玩家是否有挂机的 话,就是要看客户端是不是在单位时间内没发数据,如果是就关闭连接。那如果弄了心跳机制(会定时的发一下数据给服务端),那样就检测不出是不是玩家挂机了。

阅读 3.1k
1 个回答

你说的所谓“感知”那是 Socket 中断了。

但事实上首先 Client 死掉了并不一定是因为 Socket 中断;其次就算是 Socket 中断,但是否中断完全取决于客户端与服务端的连接设置,从 TCP 协议的层面上并不能实时地感知到连接中断了,往往要等到超时一段时间收才会知道;最后传输层本身的设计问题以及网络拓扑结构的复杂性,导致客户端也不能事实知道服务端挂了,心跳不只是让服务端知道客户端还活着,也是客户端嗅探服务端是否健在的手段,二者是双向的。


至于你最后举的例子,与 Netty 无关。

P.S. 心跳包和用户行为的数据包还能长的一样吗?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题