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