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