netty防止同一个设备多个常连接

本文介绍了如何使用全局变量管理Netty的常连接,确保设备登录时正确识别并处理同一连接。通过维护一个ChannelHandlerContext的Map,当设备重连时检查IP和端口,避免关闭已有连接。同时,心跳断开时清理连接信息,保持连接状态的准确。
摘要由CSDN通过智能技术生成

困扰了我一周的问题,终于解决了,而且是睡醒一觉,突然就顿悟了。问题:每次设备登录,都会和netty建立一个常连接,如果不能判断是否为同一个常连接,常连接就会断掉。emo,能懂我的意思吧?

  1. 在通讯初始化的时候,就定义一个全局变量,并给这个全局变量写一个查询、清空、更新方法。
//全局变量
Map<String, ChannelHandlerContext> contextHashMap = new HashMap<>();
//获取全局变量信息
public ChannelHandlerContext getContext(String key){
	return contextHashMap.get(key);
}
//更新全局变量信息
public void addContext(String key,ChannelHandlerContext ctx){
	contextHashMap.put(key,ctx);
}
//清空全局变量信息
public void deleteContext(String key){
	contextHashMap.remove(key);
}
  1. 设备在第一次和程序建立通讯的时候,全局变量是没有值的。在注册或者注册成功的代码后,把常连接赋值给全局变量,心跳时间之内,设备再一次建立通讯,直接把第一次的常连接关闭,再把全部变量再更新一次。
//如果判断不是空,就代表已经注册过了。
if(Optional.ofNullable(usrChannelHandlerImpl.getContext(usrDtuMsg.getIdentityId())).isPresent()){
	ChannelHandlerContext channelHandlerContext = usrChannelHandlerImpl.getContext(usrDtuMsg.getIdentityId());
	//如果两个常连接的IP和端口号不一致,就直接关闭上一个常连接
	if(!channelHandlerContext.channel().remoteAddress().equals(ctx.channel().remoteAddress())){
		channelHandlerContext.close();
	}
}
//每次都更新一次。
usrChannelHandlerImpl.addContext(usrDtuMsg.getIdentityId(),ctx);
  1. 心跳那里,每断开一次心跳,都清空一下全局变量。
//每次心跳离线,都清除一下常连接信息
usrChannelHandlerImpl.deleteContext(conn.getIdentityId());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值