netty客户端断开连接服务器能够感知到,不使用发送心跳包的方式

最近公司有需求,使用netty服务器来操作设备,这个设备是应答模式,就是上位机发送指令后,下位机会应答(应答才表示指令发送成功),开始的时候我使用的是发送心跳包(心跳包是一个指令,设备会应答)的方式来确定设备是否还在连接中,后来发现电池的电量消耗太快(由于想要省电,当时已经设置为10s一次心跳了,但是还是太快),我们的使用场景是在用户设备使用过程中是不会充电的,所以只能想别的办法,最后找到了一个解决方法。

服务器是在linux环境下,修改/etc/sysctl.conf文件

添加以下内容:

#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为5秒钟。

net.ipv4.tcp_keepalive_time = 5

#如果对方不予应答,探测包的发送次数

net.ipv4.tcp_keepalive_probes = 5

#探测消息发送的频率

net.ipv4.tcp_keepalive_intvl = 1

这个是修改的linux tcp发送探测包配置的

修改完成后输入以下命令生效

/sbin/sysctl -p
/sbin/sysctl -w net.ipv4.route.flush=1

这样设置完成以后,每次客户端断开连接后7,8秒后会执行以下方法

public class TcpServerHandler extends SimpleChannelInboundHandler<ByteBuf>{

    @Override

    public void handlerRemoved(ChannelHandlerContext ctx) throw Exception{

        //这里执行客户端断开连接后的操作

    }

}

这里的设置不一定适合每一个人,我测试了三个参数都设置为1,这样以后设备断开连接后1,2秒服务器就能感知到,但是也会出现问题,有时候网络不稳定,一个探测包没有探测到,系统就自动断开连接了,所以这个需要自己去进行测试设置为多大最好。

我本身对Linux不是很了解,所以以上说法有错误的地方请指出谢谢。

 

 

 

在想解决方案的时候还想到一种方法,但是不适合我们的场景,也不知道能否实现,这里只是提供一个思路:

设备连接上服务器后,服务器可以记录设备ip,然后ping这个ip来判断设备是否还在连接中,具体操作没有想太多,就到这里吧。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Netty服务器中,可以通过设置心跳检测来实现不自动断开客户端连接。 心跳检测是通过定期发送心跳消息来检测客户端是否还存活的一种机制。如果客户端在一定时间内没有发送任何消息,服务器就会认为客户端已经掉线,并断开连接。 要设置心跳检测,可以通过在Netty服务器的ChannelInitializer中添加一个IdleStateHandler来实现。例如,下面的代码设置了心跳检测,每隔60秒发送一次心跳消息: ```java public class MyChannelInitializer extends ChannelInitializer<SocketChannel> { @Override protected void initChannel(SocketChannel ch) throws Exception { // 添加心跳检测,60秒没有读取到客户端的消息就发送心跳请求 ch.pipeline().addLast(new IdleStateHandler(60, 0, 0, TimeUnit.SECONDS)); // 添加自定义处理器 ch.pipeline().addLast(new MyHandler()); } } ``` 在自定义处理器中,可以实现对心跳消息的处理,例如,回复一个心跳响应消息: ```java public class MyHandler extends ChannelInboundHandlerAdapter { @Override public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { if (evt instanceof IdleStateEvent) { // 如果是读空闲事件,则发送心跳请求 IdleStateEvent event = (IdleStateEvent) evt; if (event.state() == IdleState.READER_IDLE) { ctx.writeAndFlush("heartbeat"); } } else { super.userEventTriggered(ctx, evt); } } } ``` 通过设置心跳检测和自定义处理器,可以实现不自动断开客户端连接的效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值