Просмотр исходного кода

2023-12-15 netty 处理拆包问题。

chaiyunlong лет назад: 2
Родитель
Сommit
6a7720eac0

+ 29 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/ChannelMapJson.java

@@ -0,0 +1,29 @@
+package com.zd.laboratory.netty;
+
+import io.netty.channel.ChannelHandlerContext;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public class ChannelMapJson {
+
+    /**
+     * 存放客户端标识ID(消息ID)与channel的对应关系
+     */
+    private static ConcurrentHashMap<ChannelHandlerContext,String> channelMap = new ConcurrentHashMap<>();
+
+    private ChannelMapJson() {
+    }
+
+    public static ConcurrentHashMap<ChannelHandlerContext, String> getChannelMap() {
+        synchronized(channelMap) {
+            if (null == channelMap) {
+                channelMap = new ConcurrentHashMap<>();
+            }
+        }
+        return channelMap;
+    }
+
+    public static String getChannel(ChannelHandlerContext context) {
+        return getChannelMap().get(context);
+    }
+}

+ 14 - 0
zd-modules/zd-modules-laboratory/src/main/java/com/zd/laboratory/netty/NettyServerHandler.java

@@ -26,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.*;
@@ -39,6 +40,9 @@ public class NettyServerHandler implements ChannelInboundHandler {
 
     private  BeaconMate beaconMate = new BeaconMateImpl();
 
+
+    private static Map<String,Object> map =new HashMap <>();
+
     /**
      * 读取客户端发送的消息
      */
@@ -48,6 +52,7 @@ public class NettyServerHandler implements ChannelInboundHandler {
         String data = TCPServer.bytesToHexString(msg).toUpperCase();
         String dataStr=TCPServer.hexStr2Str(data);
         log.info("**************************************"+dataStr+"****************************************");
+
         if(data.startsWith(SocketTypes.RELAY_PREFIX.replaceAll(" ", "").toUpperCase())){
 
             analyticRelayData(data, channelHandlerContext);
@@ -87,6 +92,15 @@ public class NettyServerHandler implements ChannelInboundHandler {
             RelayUtils.relayOpenClose(dataStr,relayCode);
         }else if(JsonUtils.isJsonString(dataStr)){
             beaconMate.sendBeaconMate(dataStr);
+        }else{
+            if(dataStr.indexOf("{")>0 && dataStr.lastIndexOf("}")==-1){
+                ChannelMapJson.getChannelMap().put(channelHandlerContext,dataStr);
+            }else if(dataStr.indexOf("{")==-1 && dataStr.lastIndexOf("}")>0){
+                if(ChannelMapJson.getChannelMap().get(channelHandlerContext)!=null){
+                    String newDataStr = ChannelMapJson.getChannelMap().get(channelHandlerContext)+dataStr;
+                    beaconMate.sendBeaconMate(newDataStr);
+                }
+            }
         }
     }