netty 客户端或服务端断网处理

对于 netty 客户端或服务端一方断网或网络异常, 另外一端是不知道的。 网络良好时一端 close 另一端会回调 InActive , 但断网或网络异常时是不会回调 InActive 的,因为没法回调,连接不通, 上层根本就不知道底层连接的状态。 且TCP 自带的心跳包默认是 2h。

这时只有用应用层心跳包解决, 无论客户端或服务端只要一定时间内比如 30s, 没有收到另一端发送的心跳包 (一般设置读超时)就认为连接不可用了,而不管是断网还是另一端宕机等各种情况。 这时客户端读超时可以 close 连接后重连, 服务端读超时后可以直接 close 掉连接。

心跳包还是用内置的 IdleHandler 来做, 一般是用写超时,比如 5 秒内没有写任何数据,就触发写超时来发送一个心跳包。

为什么不定时发送心跳包比如一秒发送一次心跳包,这显而易见正常通信时连接肯定是好的, 如果定时发送就会暂用业务流量,都是用 IdleHandler 来做心跳。

项目实施时发现断网后客户端没有重连,发现客户端没有设置心跳检测,之前没有考虑这种情况。平时基础还是要打好一些才能更快的定位问题。

你可能感兴趣的:(netty 客户端或服务端断网处理)