From d8bf4f4d66715f002d024cae92862c1d83daa425 Mon Sep 17 00:00:00 2001
From: hxb <hxb@hdlchina.com.cn>
Date: 星期日, 12 十二月 2021 22:06:35 +0800
Subject: [PATCH] 更改了udp的机制

---
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java        |  103 +++++++
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java |  113 ++++++-
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java   |  105 +++++--
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java        |   40 ++
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java         |  236 +++++++---------
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketPool.java               |    3 
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java               |   40 +-
 HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketOptions.java     |   26 +
 HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java       |  160 -----------
 9 files changed, 454 insertions(+), 372 deletions(-)

diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java
index 46757ec..c823c46 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java
@@ -1,6 +1,5 @@
 package com.hdl.sdk.connect.socket;
 
-import android.net.ipsec.ike.TunnelModeChildSessionParams;
 import android.text.TextUtils;
 
 import com.google.gson.Gson;
@@ -30,15 +29,13 @@
 import com.hdl.sdk.connect.bean.LinkResponse;
 import com.hdl.sdk.connect.protocol.LinkMessageDecoder;
 import com.hdl.sdk.connect.protocol.LinkMessageEncoder;
-import com.hdl.sdk.socket.SocketBoot;
-import com.hdl.sdk.socket.SocketOptions;
 import com.hdl.sdk.socket.client.UdpClient;
 import com.hdl.sdk.socket.codec.MessagePipeLine;
-import com.hdl.sdk.socket.listener.SendListener;
+import com.hdl.sdk.socket.udp.UdpSocketBoot;
+import com.hdl.sdk.socket.udp.UdpSocketOptions;
 
-import java.io.UnsupportedEncodingException;
+import java.net.InetSocketAddress;
 import java.util.List;
-import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -47,7 +44,7 @@
 /**
  * Created by jlchen on 11/11/21.
  *
- * @Description : HDLAuthSocket
+ * @Description : HDLAuthSocket 鐢变簬鍓嶆湡宸茬粡鍛藉悕濂斤紝涓嶅仛鏇存敼锛屽彲鐢ㄤ綔Udp鏈嶅姟绔娇鐢�
  */
 public class HDLAuthSocket {
     private static final String TAG = "HDLAuth";
@@ -55,7 +52,10 @@
      * udp榛樿绔彛
      */
     private static final int UDP_PORT = 8585;
-    private static SocketBoot updBoot;
+    /**
+     * 鍥犱负鑰冭檻鍒颁娇鐢ㄤ竴涓鍙o紝瑕佹敮鎸佹帴鏀跺缃戝叧鐨勬暟鎹紝鎵�浠ュ彧鍏佽浣跨敤涓�涓�
+     */
+    private static UdpSocketBoot udpSocketBoot;
     //    private EventListener authEvent;
     //鎼滅储缃戝叧
     private EventListener searchGatewayEvent;
@@ -71,6 +71,7 @@
 
     private HDLAuthSocket() {
         initSearchGatewayEvent();
+        initListenerGatewayEvent();
     }
 
 //    public interface CallBack extends BaseCallBack {
@@ -87,30 +88,39 @@
             synchronized (HDLLinkConfig.class) {
                 if (instance == null) {
                     instance = new HDLAuthSocket();
+                    //1.鍚姩Socket 寮�鍚洃鍚�
+                    instance.getUdpBoot();
                 }
             }
         }
         return instance;
     }
 
-    private SocketOptions getUdpOptions() {
-        final SocketOptions options = new SocketOptions();
+    private UdpSocketOptions getUdpOptions() {
+        final UdpSocketOptions options = new UdpSocketOptions();
         final MessagePipeLine pipeLine = new MessagePipeLine();
         pipeLine.add(new LinkMessageDecoder());
         pipeLine.add(new LinkMessageEncoder());
         options.setHandleMessage(pipeLine);
-        options.setHeartbeatTimeInterval(10*1000L);
-        options.setHeartbeatData("UDP");
-        options.setEnabledHeartbeat(true);//鏄惁寮�鍚績璺冲寘鍙戦�佹娴�
         return options;
     }
 
-    private SocketBoot getUdpBoot(String ip) {
-        if (updBoot == null) {
-            updBoot = UdpClient.init(ip, UDP_PORT, getUdpOptions());
-            updBoot.connect();
+
+    /**
+     * 鑾峰彇褰撳墠udp瀵硅薄锛屽鏋滀笉瀛樺湪灏卞垱寤�
+     * @return 杩斿洖褰撳墠瀵硅薄
+     */
+    private UdpSocketBoot getUdpBoot() {
+        try {
+            if (udpSocketBoot == null) {
+                udpSocketBoot = UdpClient.init(UDP_PORT, getUdpOptions());
+                udpSocketBoot.bind();
+            }
+        } catch (Exception e) {
+            return null;
         }
-        return updBoot;
+
+        return udpSocketBoot;
     }
 
     /**
@@ -121,8 +131,6 @@
      */
     public void startAuthenticateRequest(AuthenticateRequest request, HDLLinkCallBack callBack) {
         HDLLinkConfig.getInstance().clearConfig();
-        //1.鍚姩Socket 寮�鍚洃鍚�
-        getUdpBoot(IpUtils.getBroadcastAddress());
         //2.鏋勫缓鐩戝惉Listener
 //        authEvent =
         //3.鐩戝惉缃戝叧骞挎挱鐨勫叆缃戞寚浠�
@@ -168,7 +176,7 @@
         String requestStr = gs.toJson(request);
         LinkRequest message = new LinkRequest(topic, requestStr);
 
-        HdlSocketHelper.send(getUdpBoot(ip), message, new HdlSocketHelper.HdlSocketListener() {
+        HdlSocketHelper.send(getUdpBoot(), InetSocketAddress.createUnresolved(ip,UDP_PORT), message, new HdlSocketHelper.HdlSocketListener() {
             @Override
             public void onSucceed(Object msg) {
                 if (callBack == null) return;
@@ -284,7 +292,7 @@
      * @param callBack 鍥炶皟
      */
     public void searchGatewayMulticast(SearchGatewayCallBack callBack) {
-        searchGateway(HDLLinkConfig.getInstance().getGatewayId(), UDP_GROUP_IP, callBack);
+        searchGateway(HDLLinkConfig.getInstance().getGatewayId(),  InetSocketAddress.createUnresolved(UDP_GROUP_IP,UDP_PORT), callBack);
     }
 
     /**
@@ -294,7 +302,7 @@
      */
     public void searchGatewayBroadcast(SearchGatewayCallBack callBack) {
         String ip = IpUtils.getBroadcastAddress();
-        searchGateway(HDLLinkConfig.getInstance().getGatewayId(), ip, callBack);
+        searchGateway(HDLLinkConfig.getInstance().getGatewayId(),  InetSocketAddress.createUnresolved(ip,UDP_PORT), callBack);
     }
 
 
@@ -312,7 +320,7 @@
                 GsonConvert.getGson().toJson(data));
 
         String ip = IpUtils.getBroadcastAddress();
-        HdlSocketHelper.send(getUdpBoot(ip), message, new HdlSocketHelper.HdlSocketListener() {
+        HdlSocketHelper.send(getUdpBoot(), InetSocketAddress.createUnresolved(ip,UDP_PORT), message, new HdlSocketHelper.HdlSocketListener() {
             @Override
             public void onSucceed(Object msg) {
                 if (callBack == null) return;
@@ -345,7 +353,7 @@
         }
         LinkRequest message = new LinkRequest(topic, bodyStr);
         String ip = IpUtils.getBroadcastAddress();
-        HdlSocketHelper.send(getUdpBoot(ip), message, new HdlSocketHelper.HdlSocketListener() {
+        HdlSocketHelper.send(getUdpBoot(), InetSocketAddress.createUnresolved(ip,UDP_PORT), message, new HdlSocketHelper.HdlSocketListener() {
                     @Override
                     public void onSucceed(Object msg) {
                         if (callBack == null) return;
@@ -374,7 +382,7 @@
         }
         LinkRequest message = new LinkRequest(topic, bodyStr);
         String ip = IpUtils.getBroadcastAddress();
-        getUdpBoot(ip).sendMsg(message.getSendBytes());
+        getUdpBoot().sendMsg( InetSocketAddress.createUnresolved(ip,UDP_PORT),message.getSendBytes());
     }
 
     private GatewaySearchBean getGatewaySearchBean(Object msg) {
@@ -433,7 +441,7 @@
     private SearchGatewayCallBack mSearchGatewayCallBack;
 
     private void initSearchGatewayEvent() {
-        LogUtils.i("鎼滅储缃戝叧--", "initSearchGatewayEvent");
+        LogUtils.i("鎼滅储缃戝叧", "initSearchGatewayEvent");
         searchGatewayEvent = new EventListener() {
             @Override
             public void onMessage(Object msg) {
@@ -441,7 +449,6 @@
                     if (msg instanceof LinkResponse) {
                         LinkResponse linkResponse = (LinkResponse) msg;
                         String data = linkResponse.getData();
-                        LogUtils.i("鎼滅储鍒扮綉鍏�->" + data);
                         if (!TextUtils.isEmpty(data)) {
                             final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() {
                             }.getType());
@@ -467,14 +474,44 @@
         };
     }
 
+    private void initListenerGatewayEvent() {
+        LogUtils.i( "鍒濆鍖栨案涔呯洃鍚綉鍏冲箍鎾簨浠讹紝涓嶇敤绉婚櫎姝や簨浠�");
+        EventListener  gatewayEvent = new EventListener() {
+            @Override
+            public void onMessage(Object msg) {
+                try {
+                    if (msg instanceof LinkResponse) {
+                        LinkResponse linkResponse = (LinkResponse) msg;
+                        String data = linkResponse.getData();
+                        LogUtils.i("鎺ユ敹鍒扮綉鍏充俊鎭細" + data);
+                        if (!TextUtils.isEmpty(data)) {
+                            final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() {
+                            }.getType());
+                            GatewaySearchBean searchBean = response.getObjects();
+                            if (searchBean != null && !TextUtils.isEmpty(searchBean.getGatewayId())) {
+                                if (searchBean.getGatewayId().equals(HDLLinkConfig.getInstance().getGatewayId())) {
+                                    HDLLinkConfig.getInstance().setCurrentGateway(searchBean);//璁剧疆褰撳墠缃戝叧
+                                    HDLLinkConfig.getInstance().setLocalEncrypt(searchBean.isLocalEncrypt());//璁剧疆鏄惁鍔犲瘑
+                                }
+                            }
+                        }
+                    }
+                } catch (Exception e) {
+
+                }
+            }
+        };
+        EventDispatcher.getInstance().registerIo(TopicConstant.GATEWAY_SEARCH_REPLY, gatewayEvent);
+    }
+
     /**
      * 鎼滅储鎸囧畾缃戝叧鏄惁鍦ㄧ嚎锛屾悳绱㈠埌鍒欒繑鍥炴寚瀹氱殑缃戝叧瀵硅薄
      *
      * @param gatewayId 缃戝叧id
-     * @param ip        鎺ユ敹鐩爣鐨刬p鍦板潃
+     * @param desInetSocketAddress        鐩爣鐨勫湴鍧�
      * @param callBack  鍥炶皟
      */
-    public void searchGateway(String gatewayId, String ip, SearchGatewayCallBack callBack) {
+    public void searchGateway(String gatewayId, InetSocketAddress desInetSocketAddress, SearchGatewayCallBack callBack) {
         this.searchGatewayId = gatewayId;
         this.mSearchGatewayCallBack = callBack;
         //閲嶇疆鍙傛暟
@@ -495,8 +532,8 @@
                     try {
                         //鎼滅储缃戝叧
                         searchGatewayCount.set(searchGatewayCount.get() + 1);
-                        LogUtils.i("鎼滅储缃戝叧--", "鎼滅储缃戝叧绗�" + searchGatewayCount.get() + "娆�");
-                        getUdpBoot(ip).sendMsg(message.getSendBytes());
+                        LogUtils.i("鎼滅储缃戝叧", "鎼滅储缃戝叧绗�" + searchGatewayCount.get() + "娆�");
+                        getUdpBoot().sendMsg(desInetSocketAddress,message.getSendBytes());
                         Thread.sleep(1000L);
                     } catch (InterruptedException e) {
                         e.printStackTrace();
@@ -517,7 +554,7 @@
      * 娉ㄥ唽鎼滅储缃戝叧鐩戝惉
      */
     private void registerSearchGatewayEvent() {
-        LogUtils.i("鎼滅储缃戝叧--", "娉ㄥ唽鎼滅储缃戝叧鐩戝惉");
+        LogUtils.i("鎼滅储缃戝叧", "娉ㄥ唽鎼滅储缃戝叧鐩戝惉");
         EventDispatcher.getInstance().registerIo(TopicConstant.GATEWAY_SEARCH_REPLY, searchGatewayEvent);
     }
 
@@ -525,7 +562,7 @@
      * 绉婚櫎鎼滅储缃戝叧鐩戝惉
      */
     private void removeSearchGatewayEvent() {
-        LogUtils.i("鎼滅储缃戝叧--", "绉婚櫎鎼滅储缃戝叧鐩戝惉");
+        LogUtils.i("鎼滅储缃戝叧", "绉婚櫎鎼滅储缃戝叧鐩戝惉");
         EventDispatcher.getInstance().remove(TopicConstant.GATEWAY_SEARCH_REPLY, searchGatewayEvent);
     }
 
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
index 5f82461..8489b60 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
@@ -50,40 +50,14 @@
  */
 public class HDLSocket {
 
-//    public interface CallBack extends BaseCallBack {
-//        void onResponse(String data);
-//    }
-//
-//    /**
-//     * udp榛樿缁勬挱ip
-//     */
-//    private static final String UDP_GROUP_IP = "239.0.168.188";
-
-    /**
-     * udp榛樿绔彛
-     */
-    private static final int UDP_PORT = 8585;
-
     /**
      * tcp榛樿绔彛
      */
     private static final int TCP_PORT = 8586;
 
-    //    private String tcpIp;
-//    private int tcpPort;
-
-//    private int udpPort;
-//    private String udpIp;
-
-//    private static SocketBoot updBoot;
     private SocketBoot tcpBoot;
 
     private ConnectStatusListener statusListener;
-
-//    private EventListener searchEvent;
-//    private CallBack searchCallBack;
-//    private ScheduledExecutorService searchGatewayThread;
-//    private final AtomicInteger searchCount = new AtomicInteger(0);
 
     private HDLSocket() {
         statusListener = new ConnectStatusListener() {
@@ -102,43 +76,6 @@
 
             }
         };
-//        searchEvent = new EventListener() {
-//            @Override
-//            public void onMessage(Object msg) {
-//                try {
-//                    if (msg instanceof LinkResponse) {
-//                        LinkResponse linkResponse = (LinkResponse) msg;
-//                        String data = linkResponse.getData();
-//                        if (!TextUtils.isEmpty(data)) {
-//                            final BaseLocalResponse<GatewaySearchBean> response = GsonConvert.getGson().fromJson(data, new TypeToken<BaseLocalResponse<GatewaySearchBean>>() {
-//                            }.getType());
-//                            GatewaySearchBean searchBean = response.getObjects();
-//                            if (searchBean != null) {
-////                                gatewayId = searchBean.getGatewayId();
-////                                if (!TextUtils.isEmpty(gatewayId)) {
-////                                    SPUtils.put(GATEWAY_KEY, gatewayId);
-////                                }
-////                                tcpIp = searchBean.getIp_address();
-////                                if (!TextUtils.isEmpty(tcpIp)) {
-////                                    SPUtils.put(TCP_IP_KEY, tcpIp);
-////                                }
-//                            }
-//
-//                            if (searchCallBack != null) {
-//                                searchCallBack.onResponse(linkResponse.toString());
-//                            }
-//                        }
-//
-//                    }
-//                } catch (Exception e) {
-//                    if (searchCallBack != null) {
-//                        searchCallBack.onError("瑙f瀽澶辫触");
-//                    }
-//                }
-//
-//
-//            }
-//        };
     }
 
     private static class SingletonInstance {
@@ -149,16 +86,6 @@
         return SingletonInstance.INSTANCE;
     }
 
-
-//    private SocketOptions getUdpOptions() {
-//        final SocketOptions options = new SocketOptions();
-//        final MessagePipeLine pipeLine = new MessagePipeLine();
-//        pipeLine.add(new LinkMessageDecoder());
-//        pipeLine.add(new LinkMessageEncoder());
-//        options.setHandleMessage(pipeLine);
-//        options.setEnabledHeartbeat(false);
-//        return options;
-//    }
 
     private SocketOptions getTcpOptions() {
         final SocketOptions options = new SocketOptions();
@@ -173,9 +100,6 @@
         return options;
     }
 
-    private int getUdpPort() {
-        return UDP_PORT;
-    }
 
     public int getTcpPort() {
         return TCP_PORT;
@@ -188,90 +112,6 @@
     public String getGatewayId() {
         return HDLLinkConfig.getInstance().getGatewayId();
     }
-
-
-//    private String getUdpIp() {
-//        if (TextUtils.isEmpty(udpIp)) {
-//            udpIp = UDP_GROUP_IP;
-//        }
-//        return udpIp;
-//    }
-
-//    public void searchGateway() {
-//        searchGateway(null);
-//    }
-//
-//    /**
-//     * 缁勬挱鎼滅储
-//     */
-//    public void searchGateway(CallBack callBack) {
-////        gatewayId = "";//閲嶇疆缃戝叧ID
-////        this.searchCallBack = callBack;
-////
-////        if (searchGatewayThread != null) {
-////            searchGatewayThread.shutdownNow();
-////        }
-////
-////
-////        new Thread(new Runnable() {
-////            @Override
-////            public void run() {
-////                while (TextUtils.isEmpty(gatewayId)) {
-////                    //鎼滅储缃戝叧
-////                    searchGateway(IdUtils.getUUId(), searchEvent);
-////                    try {
-////                        Thread.sleep(1000L);
-////                    } catch (InterruptedException e) {
-////                        e.printStackTrace();
-////                    }
-////                }
-////            }
-////        }).start();
-//    }
-//
-//
-//    /**
-//     * 閫氳繃缁勬挱鎼滅储缃戝叧
-//     */
-//    public void searchGateway(String msgId, EventListener eventListener) {
-//        searchGateway(getUdpIp(), getUdpPort(), msgId, eventListener);
-//    }
-//
-//    /**
-//     * 閫氳繃骞挎挱鎼滅储缃戝叧
-//     */
-//    public void searchGatewayByBroadcast(String msgId, EventListener eventListener) {
-//        searchGateway(IpUtils.getBroadcastAddress(), getUdpPort(), msgId, eventListener);
-//    }
-//
-//    /**
-//     * 榛樿鏄粍鎾悳绱㈢綉鍏�
-//     */
-//    public void searchGateway(String ip, int port, String msgId, EventListener eventListener) {
-//
-//        if (updBoot == null) {
-//            updBoot = UdpClient.init(ip, port, getUdpOptions());
-//            updBoot.connect();
-//        }
-//
-//
-//        String time = String.valueOf(System.currentTimeMillis());
-//        JsonObject jsonObject = new JsonObject();
-//        jsonObject.addProperty("id", msgId);
-//        jsonObject.addProperty("time_stamp", time);
-//
-//        EventDispatcher.getInstance().registerIo(TopicConstant.GATEWAY_SEARCH_REPLY, eventListener);
-//        LinkRequest message = new LinkRequest(TopicConstant.GATEWAY_SEARCH,
-//                jsonObject.toString());
-//
-//        try {
-//            updBoot.sendMsg(message.getSendBytes());
-//        } catch (UnsupportedEncodingException e) {
-//            e.printStackTrace();
-//        }
-//
-//    }
-
 
     /**
      * 鑾峰彇璁惧鍒楄〃
diff --git a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java
index 99a703a..ea53e38 100644
--- a/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java
+++ b/HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java
@@ -7,7 +7,9 @@
 import com.hdl.sdk.common.utils.ThreadToolUtils;
 import com.hdl.sdk.connect.bean.LinkRequest;
 import com.hdl.sdk.socket.SocketBoot;
+import com.hdl.sdk.socket.udp.UdpSocketBoot;
 
+import java.net.InetSocketAddress;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -25,15 +27,17 @@
     private final Long sendAwaitTime;
     private final int maxRetry;
 
-    private final SocketBoot boot;
+    private SocketBoot boot;
+    private UdpSocketBoot udpSocketBoot;
+    private InetSocketAddress inetSocketAddress;
     private final LinkRequest linkRequest;
     private final EventListener eventListener;
 
     private final AtomicInteger sendNumber;
 
-    private final AtomicBoolean isSend = new AtomicBoolean();
+    private final AtomicBoolean isSend = new AtomicBoolean(false);
 
-    private final HdlSocketListener listener;
+    private HdlSocketListener listener;
 
     private ScheduledExecutorService sendThread;
 
@@ -66,12 +70,37 @@
         EventDispatcher.getInstance().register(observeTopic, eventListener);
     }
 
+    private HdlSocketHelper(Long sendAwaitTime, int maxRetry, UdpSocketBoot udpSocketBoot,
+                            InetSocketAddress inetSocketAddress, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) {
+        this.sendAwaitTime = sendAwaitTime;
+        this.maxRetry = maxRetry;
+        this.udpSocketBoot = udpSocketBoot;
+        this.inetSocketAddress = inetSocketAddress;
+        this.linkRequest = linkRequest;
+        this.listener = listener;
+        this.sendNumber = new AtomicInteger(0);
+        eventListener = new EventListener() {
+            @Override
+            public void onMessage(Object msg) {
+                isSend.set(true);
+                if (listener != null) {
+                    listener.onSucceed(msg);
+                }
+                if (sendThread != null) {
+                    sendThread.shutdownNow();
+                }
+                EventDispatcher.getInstance().remove(eventListener);
+            }
+        };
+        EventDispatcher.getInstance().register(observeTopic, eventListener);
+    }
+
     public static void send(SocketBoot boot, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener, Long sendAwaitTime, int maxRetry) {
         if (TextUtils.isEmpty(observeTopic)) {
             observeTopic = linkRequest.getTopic() + "_reply";
         }
         HdlSocketHelper socketHelper = new HdlSocketHelper(sendAwaitTime, maxRetry, boot, linkRequest, observeTopic, listener);
-        socketHelper.resend();
+        socketHelper.send();
     }
 
     public static void send(SocketBoot boot, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) {
@@ -87,34 +116,78 @@
         send(boot, linkRequest, "", listener, DEF_SEND_TIMEOUT, DEF_SEND_ONE);
     }
 
-    private void resend() {
+    /**
+     * Udp鐨勫彂閫佹柟娉�
+     *
+     * @param udpSocketBoot     Udp褰撳墠瀵规帴
+     * @param inetSocketAddress 鍙戦�佺殑鐩爣鍦板潃
+     * @param linkRequest       鍙戦�佺殑鏁版嵁
+     * @param observeTopic      鍙戦�佺殑涓婚
+     * @param listener          鍥炶皟
+     */
+    public static void send(UdpSocketBoot udpSocketBoot, InetSocketAddress inetSocketAddress, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) {
+        if (TextUtils.isEmpty(observeTopic)) {
+            observeTopic = linkRequest.getTopic() + "_reply";
+        }
+        HdlSocketHelper socketHelper = new HdlSocketHelper(DEF_SEND_TIMEOUT, DEF_SEND_ONE, udpSocketBoot, inetSocketAddress, linkRequest, observeTopic, listener);
+        socketHelper.send();
+    }
+
+    /**
+     * Udp鍙戦�佺殑鏂规硶
+     *
+     * @param udpSocketBoot     褰撳墠Udp瀵硅薄
+     * @param inetSocketAddress 鍙戦�佺殑鐩爣鍦板潃
+     * @param linkRequest       鍙戦�佺殑瀵硅薄
+     * @param listener          鍥炶皟
+     */
+    public static void send(UdpSocketBoot udpSocketBoot, InetSocketAddress inetSocketAddress, LinkRequest linkRequest, HdlSocketListener listener) {
+        String observeTopic = null;
+        if (TextUtils.isEmpty(observeTopic)) {
+            observeTopic = linkRequest.getTopic() + "_reply";
+        }
+        HdlSocketHelper socketHelper = new HdlSocketHelper(DEF_SEND_TIMEOUT, DEF_SEND_ONE, udpSocketBoot, inetSocketAddress, linkRequest, observeTopic, listener);
+        socketHelper.send();
+    }
+
+    private void send() {
         getSendThread().scheduleWithFixedDelay(new Runnable() {
             @Override
             public void run() {
-                if ((sendNumber.get() < maxRetry + 2) || !isSend.get()) {
+                //鍙戦�佹鏁板皬浜庨噸鍙戞鏁�
+                if ((sendNumber.get() < maxRetry)) {
                     try {
-                        if (sendNumber.get() < maxRetry + 1) {
+                        //杩樻病鏈夋敹鍒板洖澶嶏紝鍐嶅彂閫�
+                        if (!isSend.get()) {
+                            sendNumber.set(sendNumber.get() + 1);
+                            //濡傛槸tcp
                             if (boot != null) {
                                 boot.sendMsg(linkRequest.getSendBytes());
                             }
-                            sendNumber.set(sendNumber.get() + 1);
-                        } else {
-                            notifyFailure();
+                            //濡傛灉鏄痷dp
+                            if (null != udpSocketBoot) {
+                                udpSocketBoot.sendMsg(inetSocketAddress, linkRequest.getSendBytes());
+                            }
                         }
                     } catch (Exception e) {
                         e.printStackTrace();
-                        sendNumber.set(sendNumber.get() + 1);
-                    } finally {
-                        if (sendNumber.get() > maxRetry + 1 && !isSend.get()) {
-                            notifyFailure();
-                        }
+                    }
+                } else {
+                    //瓒呭嚭閲嶅彂娆℃暟骞舵病鏈夋敹鍒板洖澶�
+                    if (!isSend.get()) {
+                        notifyFailure();
                     }
                 }
             }
         }, sendAwaitTime, sendAwaitTime, TimeUnit.MILLISECONDS);
     }
 
-    public ScheduledExecutorService getSendThread() {
+    /**
+     * 鑾峰彇鍙戦�佺嚎绋�
+     *
+     * @return 杩斿洖鑾峰彇鍒扮殑绾跨▼
+     */
+    private ScheduledExecutorService getSendThread() {
         if (sendThread == null) {
             sendThread = ThreadToolUtils.getInstance().newScheduledThreadPool(1);
         }
@@ -122,14 +195,18 @@
     }
 
 
+    /**
+     * 鍙戦�佸け璐�
+     */
     private void notifyFailure() {
+        EventDispatcher.getInstance().remove(eventListener);
         if (sendThread != null) {
             sendThread.shutdownNow();
+            sendThread = null;
         }
         if (listener != null) {
             listener.onFailure();
+            listener = null;
         }
-
-        EventDispatcher.getInstance().remove(eventListener);
     }
 }
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java
index 70e9962..0a084ac 100644
--- a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketBoot.java
@@ -127,12 +127,10 @@
             public void run() {
                 while (isRun.get()) {
                     if (client.isConnect()) {
-                        LogUtils.d("=====", "==鍙戦�佹暟鎹�==");
-
                         try {
                             SocketRequest socketRequest = mMessageQueue.take();
                             final String sendStr = new String(socketRequest.getData(), 0, socketRequest.getData().length);
-                            LogUtils.d("=====", "==鍙戦�佹暟鎹�==锛�"+sendStr);
+                            LogUtils.i("鍙戦�佹暟鎹細"+sendStr);
                             final String action = socketRequest.getAction();
                             try {
                                 client.sendMsg(socketRequest.getData());
@@ -172,28 +170,30 @@
 
     }
 
+    /**
+     * 鍒濆鍖栨帴鏀剁嚎绋嬶紝鍙渶瑕佸垵濮嬪寲涓�娆�
+     */
     public void initReceiveThread() {
         if (receiveThread == null) {
             receiveThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
-        }
-        receiveThread.execute(new Runnable() {
-            @Override
-            public void run() {
-                while (isRun.get()) {
-                    if (client.isConnect()) {
-                        try {
-                            //璇诲彇鏁版嵁
-                            client.onHandleResponse();
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                            LogUtils.d("====", "鏂紑杩炴帴" + e.getMessage());
-                            disconnectError();
+            receiveThread.execute(new Runnable() {
+                @Override
+                public void run() {
+                    while (isRun.get()) {
+                        if (client.isConnect()) {
+                            try {
+                                //璇诲彇鏁版嵁
+                                client.onHandleResponse();
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                                disconnectError();
+                            }
                         }
                     }
+                    LogUtils.i("Socket 绾跨▼閫�鍑烘帴鏀舵暟鎹�");
                 }
-            }
-        });
-
+            });
+        }
     }
 
 
@@ -258,7 +258,6 @@
         if (!client.isConnect()) {
             resetConnect(false);
         }
-
     }
 
     /**
@@ -278,7 +277,6 @@
                     if (!client.isConnect() && isOpenRetry.get()) {
                         resetConnect(false);
                     }
-
                 }
             }, 3000, TimeUnit.MILLISECONDS);
         }
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketPool.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketPool.java
index 5913d46..0b499a5 100644
--- a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketPool.java
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketPool.java
@@ -35,7 +35,7 @@
         mUdpClientPool.clear();
     }
 
-    public synchronized DatagramSocket getUdpSocket(InetSocketAddress address) throws SocketException {
+    public synchronized DatagramSocket getUdpSocket1(InetSocketAddress address) throws SocketException {
         DatagramSocket socket;
         final String key = address.toString();
         if (mUdpClientPool.containsKey(key)) {
@@ -51,5 +51,4 @@
         mUdpClientPool.put(address.toString(), socket);
         return socket;
     }
-
 }
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java
new file mode 100644
index 0000000..1fff63f
--- /dev/null
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java
@@ -0,0 +1,40 @@
+package com.hdl.sdk.socket.client;
+
+import com.hdl.sdk.socket.SocketOptions;
+import com.hdl.sdk.socket.udp.UdpSocketOptions;
+
+import java.net.InetSocketAddress;
+
+/**
+ * Created by hxb on 2021/12/12.
+ */
+public interface IUdpClient {
+
+    /**
+     * 缁戝畾绔彛
+     */
+    void bind() throws Exception;
+
+    /**
+     * 鍏抽棴褰撳墠杩炴帴
+     * @return
+     */
+    boolean close();
+
+
+    UdpSocketOptions getOptions();
+
+    /**
+     * 鐩戝惉鏁版嵁
+     */
+    void onHandleResponse() throws Exception;
+
+    /**
+     * 鍙戦�佹暟鎹�
+     * @param inetSocketAddress 鐩爣鍦板潃
+     * @param msg 鍙戦�佹暟鎹�
+     * @throws Exception
+     */
+    void sendMsg(InetSocketAddress inetSocketAddress, byte[] msg) throws Exception;
+
+}
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java
index 1f3dab9..c2a75a4 100644
--- a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java
@@ -1,135 +1,138 @@
 package com.hdl.sdk.socket.client;
 
 
-import android.util.Log;
+import android.text.TextUtils;
 
-import com.hdl.sdk.common.HDLSdk;
 import com.hdl.sdk.common.utils.IpUtils;
 import com.hdl.sdk.common.utils.LogUtils;
-import com.hdl.sdk.common.utils.ThreadToolUtils;
 import com.hdl.sdk.socket.SocketBoot;
 import com.hdl.sdk.socket.SocketOptions;
 import com.hdl.sdk.socket.SocketPool;
-import com.hdl.sdk.socket.annotation.ConnectStatus;
+import com.hdl.sdk.socket.udp.UdpSocketBoot;
+import com.hdl.sdk.socket.udp.UdpSocketOptions;
 import com.hdl.sdk.socket.codec.IHandleMessage;
-import com.hdl.sdk.socket.listener.ConnectStatusListener;
 
 import java.io.IOException;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 
 /**
- * Created by Tong on 2021/9/15.
- * 缁勬挱闇�瑕乤ndroid.permission.CHANGE_WIFI_MULTICAST_STATE鏉冮檺
- * MulticastSocket
+ * Created by hxb on 2021/12/12.
  */
-public class UdpClient implements IClient {
-
-    private static DatagramSocket mSocket;
-
-    private DatagramPacket receivePacket;
-
-    private final int BUFFER = 4 * 1024;
-
-    private final byte[] receiveByte;
-
-    private final String ip;
-
-    private final int port;
-
-    private int monitorPort;
-    private int sendPort;
-
-    private SocketOptions socketOptions;
-
-    private final AtomicBoolean isConnect = new AtomicBoolean(false);
+public class UdpClient implements IUdpClient {
 
     /**
-     * @param sendPort -1 琛ㄧず闅忔満绔彛
+     * 褰撳墠socket
      */
-    private UdpClient(String ip, int port, int monitorPort, int sendPort, SocketOptions socketOptions) {
+    private  DatagramSocket mSocket;
+
+    /**
+     * 鎺ユ敹鏁版嵁鍖�
+     */
+    private DatagramPacket receivePacket;
+
+    /**
+     * 缂撳啿鍖哄ぇ灏�
+     */
+    private final int BUFFER = 2 * 1024;
+
+    /**
+     * 鏈湴鐩戝惉IP鍦板潃
+     */
+    private String ipAddress;
+    /**
+     * 鏈湴鐩戝惉绔彛
+     */
+    private int port;
+
+    /**
+     * socket閰嶇疆淇℃伅
+     */
+    private UdpSocketOptions socketOptions;
+
+    /**
+     * 鍒濆鍖栧弬鏁�
+     * @param ipAddress 鏈湴鐩戝惉绔彛
+     * @param port 鏈湴鐩戝惉绔彛
+     * @param socketOptions
+     */
+    private UdpClient(String ipAddress,int port, UdpSocketOptions socketOptions) {
+        this.ipAddress = ipAddress;
+        this.port = port;
         this.socketOptions = socketOptions;
-        this.ip = ip;
-        this.port = port;
-        this.sendPort = sendPort;
-        this.monitorPort = monitorPort;
-        this.receiveByte = new byte[BUFFER];
+        byte[] receiveByte = new byte[BUFFER];
+        receivePacket = new DatagramPacket(receiveByte, receiveByte.length);
     }
 
-    public UdpClient(String ip, int port) {
-        this.ip = ip;
-        this.port = port;
-        this.receiveByte = new byte[BUFFER];
+    /**
+     * 鍒濆鍖栧弬鏁�
+     * @param ipAddress 鏈湴鐩戝惉IP鍦板潃
+     * @param port 鏈湴鐩戝惉绔彛
+     * @param options
+     * @return
+     */
+    public static UdpSocketBoot init(String ipAddress, int port, UdpSocketOptions options) {
+        return new UdpSocketBoot(new UdpClient(ipAddress, port, options));
     }
 
-    public static SocketBoot init(String ip, int port, int monitorPort, int sendPort, SocketOptions options) {
-        return new SocketBoot(new UdpClient(ip, port, monitorPort, sendPort, options));
+    /**
+     * 鍒濆鍖栧弬鏁�
+     * @param port 鏈湴鐩戝惉绔彛
+     * @param options
+     * @return
+     */
+    public static UdpSocketBoot init(int port, UdpSocketOptions options) {
+        return init(null, port, options);
     }
 
-    public static SocketBoot init(String ip, int port, int monitorPort, SocketOptions options) {
-        return init(ip, port, monitorPort, -1, options);
-    }
-
-    public static SocketBoot init(String ip, int port, SocketOptions options) {
-        return init(ip, port, port, -1, options);
-    }
 
     @Override
-    public void connect() throws Exception {
+    public void bind() throws Exception {
         try {
-            mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(monitorPort));
-
+            //宸茬粡缁戝畾杩囧氨涓嶇敤鍐嶇粦瀹�
+            if (null != mSocket) {
+                return;
+            }
+            if (TextUtils.isEmpty(ipAddress)) {
+                mSocket = SocketPool.getInstance().getUdpSocket1(new InetSocketAddress(port));
+            }
             mSocket.setBroadcast(true);
             mSocket.setReuseAddress(true);
-            isConnect.set(true);
-            if (receivePacket == null) {
-                receivePacket = new DatagramPacket(receiveByte, BUFFER);
-            }
+
         } catch (Exception e) {
-            isConnect.set(false);
+            LogUtils.e("鍒濆鍖朣ocket 澶辫触锛�" + e.getMessage());
             throw e;
         }
-
-
     }
 
     @Override
-    public void disconnect() {
-        if (mSocket != null) {
+    public boolean close() {
+        try {
             mSocket.close();
+        } catch (Exception e) {
+
         }
-        isConnect.set(false);
+        mSocket = null;
+        return true;
     }
 
     @Override
-    public boolean isConnect() {
-        return isConnect.get();
+    public UdpSocketOptions getOptions() {
+        return null;
     }
 
-    @Override
-    public synchronized SocketOptions getOptions() {
-        if (socketOptions == null) {
-            socketOptions = new SocketOptions();
-        }
-        return socketOptions;
-    }
-
-    @Override
     public void onHandleResponse() throws Exception {
-        if (receivePacket == null || mSocket == null) {
+        if (mSocket == null) {
             return;
         }
         try {
            mSocket.receive(receivePacket);
         } catch (IOException e) {
             e.printStackTrace();
-            isConnect.set(false);
         }
         if (receivePacket.getLength() == 0) {
             return;
@@ -142,68 +145,27 @@
 
         }
 
-        IHandleMessage handleMessage = getOptions().getHandleMessage();
-        if (handleMessage != null) {
-            byte[] data = new byte[receivePacket.getLength()];
-            System.arraycopy(receivePacket.getData(), 0, data, 0, data.length);
-            handleMessage.read(data);
-        }
-        final String receive = new String(receivePacket.getData(), 0, receivePacket.getLength());
+        try {
+            LogUtils.i( "鎺ユ敹鍒癠dp鏁版嵁鍖咃紝缃戠粶鍦板潃锛�" + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort());
 
-        LogUtils.d("---->", receive + " from " + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort());
-
-        //閲嶇疆闀垮害
-        if (receivePacket != null) {
-            receivePacket.setLength(BUFFER);
-        }
-    }
-
-    @Override
-    public void sendMsg(byte[] msg) throws Exception {
-        if (msg == null) {
-            msg = new byte[1];
-        }
-        InetAddress serverAddress = InetAddress.getByName(ip);
-        final DatagramPacket sendPacket = new DatagramPacket(msg, msg.length, serverAddress, port);
-        if (sendPort < 0) {
-            final DatagramSocket sendSocket = new DatagramSocket();
-            sendSocket.send(sendPacket);
-            sendSocket.close();
-        } else if (sendPort == monitorPort) {
-            mSocket.send(sendPacket);
-        } else {
-            final DatagramSocket sendSocket = new DatagramSocket(sendPort);
-            sendSocket.send(sendPacket);
-            sendSocket.close();
-        }
-
-    }
-
-    @Override
-    public void onConnectStatus(int status) {
-        ThreadToolUtils.getInstance().runOnUiThread(new Runnable() {
-            @Override
-            public void run() {
-                final List<ConnectStatusListener> list = getOptions().getConnectStatusListener();
-                if (list != null && !list.isEmpty()) {
-                    for (ConnectStatusListener listener : list) {
-                        switch (status) {
-                            case ConnectStatus
-                                    .CONNECTING:
-                                listener.onConnecting();
-                                break;
-                            case ConnectStatus
-                                    .CONNECTED:
-                                listener.onConnected();
-                                break;
-                            case ConnectStatus
-                                    .DISCONNECT:
-                                listener.onConnectFailed();
-                                break;
-                        }
-                    }
-                }
+            IHandleMessage handleMessage = getOptions().getHandleMessage();
+            if (handleMessage != null) {
+                byte[] data = new byte[receivePacket.getLength()];
+                System.arraycopy(receivePacket.getData(), 0, data, 0, data.length);
+                handleMessage.read(data);
             }
-        });
+
+        }catch (Exception e){
+
+        }
+    }
+
+    @Override
+    public void sendMsg(InetSocketAddress inetSocketAddress, byte[] msg) throws Exception {
+        if (msg == null) {
+            return;
+        }
+        final DatagramPacket sendPacket = new DatagramPacket(msg, msg.length, inetSocketAddress);
+        mSocket.send(sendPacket);
     }
 }
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java
new file mode 100644
index 0000000..5e87c6b
--- /dev/null
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java
@@ -0,0 +1,103 @@
+package com.hdl.sdk.socket.udp;
+
+import android.text.TextUtils;
+
+import androidx.collection.ArrayMap;
+
+import com.hdl.sdk.common.utils.LogUtils;
+import com.hdl.sdk.common.utils.ThreadToolUtils;
+import com.hdl.sdk.socket.SocketRequest;
+import com.hdl.sdk.socket.annotation.ConnectStatus;
+import com.hdl.sdk.socket.client.IClient;
+import com.hdl.sdk.socket.client.IUdpClient;
+import com.hdl.sdk.socket.listener.SendListener;
+
+import java.net.ConnectException;
+import java.net.InetSocketAddress;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingDeque;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Created by hxb on 2021/12/12.
+ */
+public class UdpSocketBoot {
+
+    private final IUdpClient client;
+
+    private final AtomicBoolean isOpenRetry = new AtomicBoolean(false);
+
+    private final AtomicInteger resendCount = new AtomicInteger(0);
+
+    private final ArrayMap<String, SendListener> sendMap = new ArrayMap<>();
+
+    public UdpSocketBoot(IUdpClient client) {
+        this.client = client;
+    }
+
+    /**
+     * 缁戝畾 socket
+     * @throws Exception 鍙兘绔彛鍐茬獊
+     */
+    public void bind() throws Exception {
+        if (null != client) {
+            client.bind();
+        }
+    }
+
+    /**
+     * 鍙戦�佹暟鎹�
+     * @param inetSocketAddress 鐩殑鐨処P鍦板潃
+     * @param msg 鍙戦�佹暟鎹�
+     * @param listener 鍙戦�佸洖璋�
+     */
+    public void sendMsg(InetSocketAddress inetSocketAddress,byte[] msg, SendListener listener) {
+        sendMsg(inetSocketAddress, msg, true, listener);
+    }
+
+    /**
+     * 鍙戦�佹暟鎹�
+     * @param inetSocketAddress 鐩殑鐨処P鍦板潃
+     * @param msg 鍙戦�佹暟鎹�
+     */
+    public void sendMsg(InetSocketAddress inetSocketAddress,byte[] msg) {
+        sendMsg(inetSocketAddress, msg, true, null);
+    }
+
+    /**
+     * 鍙戦�佹暟鎹�
+     * @param inetSocketAddress 鐩殑IP鍦板潃
+     * @param msg 鍙戦�佺殑鏁版嵁
+     * @param isRefreshRetry 鏄惁瑕侀噸鍙�
+     * @param listener 鍙戦�佸洖璋�
+     */
+    public void sendMsg(InetSocketAddress inetSocketAddress, byte[] msg, boolean isRefreshRetry, SendListener listener) {
+        if (isRefreshRetry) {
+            //閲嶇疆杩炴帴娆℃暟
+            resendCount.set(0);
+        }
+        try {
+            SocketRequest request = new SocketRequest(msg);
+            if (listener != null && !TextUtils.isEmpty(request.getAction())) {
+                sendMap.put(request.getAction(), listener);
+            }
+            client.sendMsg(inetSocketAddress, msg);
+        } catch (Exception e) {
+            LogUtils.i("鍙戦�佸け璐�:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 鍏抽棴褰撳墠socket
+     */
+    public synchronized void close() {
+        isOpenRetry.set(false);
+
+        sendMap.clear();
+        client.close();
+    }
+}
diff --git a/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketOptions.java b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketOptions.java
new file mode 100644
index 0000000..42b89cc
--- /dev/null
+++ b/HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketOptions.java
@@ -0,0 +1,26 @@
+package com.hdl.sdk.socket.udp;
+
+
+import com.hdl.sdk.socket.codec.IHandleMessage;
+import com.hdl.sdk.socket.listener.ConnectStatusListener;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by hxb on 2021/12/12.
+ */
+public class UdpSocketOptions {
+
+    //澶勭悊鏁版嵁
+    private IHandleMessage handleMessage;
+
+    public IHandleMessage getHandleMessage() {
+        return handleMessage;
+    }
+
+    public void setHandleMessage(IHandleMessage handleMessage) {
+        this.handleMessage = handleMessage;
+    }
+}

--
Gitblit v1.8.0