基于Netty的分布式设备TCP长连接映射解决方案
主旨在于解决TCP设备与管道的映射问题。在使用平台时能很方便的找到指定设备。
实际运作中平台会链接多个节点,一个节点会保持若干个设备的TCP连接,用户输入若干筛选信息,平台从筛选信息中找到对应设备ID, 先所有节点下发设备ID, 而节点会维护设备ID-管道连接映射Map,从而通过该管道映射下发相关指令。管道连接断开,Map自动删除相关映射。
实现方案:
-
解决多线程下Map数据共享问题
使用ConcurrentHashMap作为构造参数传入Server监听管道
-
解决设备ID-管道连接映射问题
当设备初次激活时,通过管道自动连接平台。设置设备ID,并使用传入的ConcurrentHashMap建立设备ID-该管道连接映射。
并使用netty channel自带的Attribute类建立管道连接-设备ID映射,避免连接断开时ConcurrentHashMap删除映射时进行遍历操作。
关键代码如下:
/** * 连接建立时进入该函数 */ @Override public void handlerAdded(ChannelHandlerContext ctx) throws Exception { System.out.println(ctx.channel().id() + "建立连接"); // 使用自带Attribute类 ctx.channel().attr(AttributeKey.valueOf("deviceId")).set(++deviceId); // Map映射 hashMap.put(deviceId, ctx.channel()); System.out.println(hashMap.entry