如何使用Netty实现心跳检测

如何使用Netty实现心跳检测,第1张

新建Java工程,并导入netty使用的jar包,最好将源码包也放在本工程下,便于了解netty的源码实现。

可以从netty自带的example中复制一个例子过来,在此基础上进行修改。

在此基础上对代码进行改造。打开EchoServer.java,添加空闲检测类。

编写心跳检测处理类。并将此类添加到pinpline的handler里面。

改造完了服务端,需要对客户端内容改造一下。启动客户端后,先发一个“hello”消息,然后等候服务端心跳信息“ping”,收到心跳后,回复心跳响应“ok”。心跳消息可以根据需要进行定义。修改的类为EchoClientHandler。

为方便查看可以将netty的日志打开。

即:将此句p.addLast(new LoggingHandler(LogLevel.INFO))前面的注释去掉,执行测试一下。查看服务端,可以看到心跳包和心跳响应。

将客户端回复心跳的内容删除,再执行查看结果。此时可以看到服务端在30秒内没有收到心跳,认为客户端连接出现问题,将此连接关闭。

心跳包主要是用来做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。

主要逻辑 :

使用netty实现长连接,主要靠心跳来维持服务器端及客户端连接。

主要的实现逻辑如下:

服务器端 :(HeartBeatRespHandler)

1, 服务器在网络空闲 *** 作一定时间后,服务端失败心跳计数器加1。

2, 如果收到客户端的ping心跳包,则清零失败心跳计数器,如果连续n次未收到客户端的ping心跳包,则关闭链路,释放资源,等待客户端重连。

客户端 :(HeartBeatReqHandler)

1, 客户端网络空闲在一定时间内没有进行写 *** 作时,则发送一个ping心跳包。

2, 如果服务器端未在发送下一个心跳包之前回复pong心跳应答包,则失败心跳计数器加1。

3, 如果客户端连续发送n(此处根据具体业务进行定义)次ping心跳包,服务器端均未回复pong心跳应答包,则客户端断开连接,间隔一定时间进行重连 *** 作,直至连接服务器成功。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存