先说一下背景吧,公司开发一款新的终端设备,用的JTT808协议。然后呢,需要一个新的网关。于是找了一下用了Netty+springboot的架构。因为以前做的都是C,C++的,刚转投JAVA门下,遇到了很多问题。
今天要说的问题就是,不使用netty的心跳机制,然后如何判断终端的设备掉线了。
先上结论,复写ChannelHandlerAdapter中的handlerRemoved。
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception{
// 我这里用了map来保存链接,方便给终端发消息用
Map<String, ChannelId> map = ChannelManager.channelIdMap;
String mapKey = "";
// 通过对比channel的id,知道哪个设备掉线了,然后删除
for(Map.Entry<String, ChannelId> entry : map.entrySet()){
mapKey = entry.getKey();
ChannelId mapValue = entry.getValue();
log.info("客户端{}读取超时,{}", mapKey,mapValue);
if(mapValue == ctx.channel().id())
{
log.info("成功了{},{}", mapKey,mapValue);
}
}
//这里执行客户端断开连接后的操作
log.error("断开了链接");
ctx.close();
if(!mapKey.equals(""))
{
map.remove(mapKey);
}
}
代码经过试验了,每当有TCP断开连接的时候,都会调用这个函数。所以可以在想要处理的handler中,复写这个函数加上要实现的内容就好了。