netty 心跳包和断线重连机制

netty 心跳包和断线重连机制,第1张

心跳包主要是用来做TCP长连接保活的。有时 socket 虽然是连接的但中间网络可能有问题,这时你还在不停的往外发送数据,但对方是收不到的,你不知道对方是不是还活着,不知道 socket 通道是不是还是联通的。 心跳包就是你发送一些试探包给对方,对方回应,如果一定时间内比如30秒内没有收到任何数据,说明对方或网络可能有问题了。这时你主动断开 socket 连接,避免浪费资源

TCP keepAlive 也是在一定时间内(默认2小时)socket 上没有接收到数据时主动断开连接,避免浪费资源,这时远端很可能已经down机了或中间网络有问题。也是通过发送一系列试探包看有没有回应来实现的。

TCP keepAlive 依赖 *** 作系统,默认是关闭的,需要修改 *** 作系统配置打开。

所以在应用层实现心跳包还是必须的。

这个是显而易见的,正常通信时说明两端连接是没有问题的,所以只在空闲的时候发送心跳包。如果每隔固定时间发送就会浪费资源占用正常通信的资源。

假设现在要做一个手机端推送的项目,所有手机通过 TCP 长连接连接到后台服务器。心跳机制是这样的:

看其他博客说不要回复,如果有 10万空闲连接,光回复心跳包就要占用大量资源。服务端读超时后直接关闭连接,客户端再进行重连。

断线重连也很简单就是在 channelInactive 的时候重新 connect 就行了。参考其他博客专门用一个 ChannelInboundHandler 来处理断线重连。

这个 watchDog Handler 应当放在 ChannelPipeline 的最前面

其实客户端和服务端都是相对的,这个看应用场景。如果客户端想要及时处理断网,路由故障等情况就需要接受服务端发来的心跳来检测。像断网,路由故障这种情况,两边都不知道TCP连接的状态,必须靠心跳。长连接服务端一般都要接收心跳包的,如果没有心跳可能会有大量的无效连接,直接耗尽服务器资源,无效的连接要尽早关闭掉。

DEMO:

https://github.com/lesliebeijing/Netty-Demo

基于 Netty 写的一个简单的推送 DEMO,可用在手机端推送

https://github.com/lesliebeijing/EncPush

Netty 客户端用在 Android 中也很稳定,我们的物联网项目Android和后台都是用的 Netty。

守护线程与普通线程在表现上没有什么区别,我们只需要通过Thread提供的方法来设定即可:

void setDaemon(boolean )

当参数为true时该线程为守护线程。

守护线程的特点是,当进程中只剩下守护线程时,所有守护线程强制终止。

GC就是运行在一个守护线程上的。

需要注意的是,设置线程为后台线程要在该线程启动前设置。

Thread daemonThread = new Thread()

daemonThread.setDaemon(true)

daemonThread.start()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11301220.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存