hxb
2021-12-13 27a0768b0e0a042911b7f299fcc599d2da4e7fc0
更改了udp测试后版本
7个文件已修改
152 ■■■■■ 已修改文件
HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketPool.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLAuthSocket.java
@@ -71,8 +71,8 @@
    private volatile static HDLAuthSocket instance;
    private HDLAuthSocket() {
        initSearchGatewayEvent();
        initListenerGatewayEvent();
        initSearchGatewayEvent();
    }
//    public interface CallBack extends BaseCallBack {
@@ -89,8 +89,6 @@
            synchronized (HDLLinkConfig.class) {
                if (instance == null) {
                    instance = new HDLAuthSocket();
                    //1.启动Socket 开启监听
                    instance.getUdpBoot();
                }
            }
        }
@@ -132,6 +130,8 @@
     */
    public void startAuthenticateRequest(AuthenticateRequest request, HDLLinkCallBack callBack) {
        HDLLinkConfig.getInstance().clearConfig();
        //1.启动Socket 开启监听
        getUdpBoot();
        //2.构建监听Listener
//        authEvent =
        //3.监听网关广播的入网指令
@@ -177,7 +177,7 @@
        String requestStr = gs.toJson(request);
        LinkRequest message = new LinkRequest(topic, requestStr);
        HdlSocketHelper.send(getUdpBoot(), InetSocketAddress.createUnresolved(ip,UDP_PORT), message, new HdlSocketHelper.HdlSocketListener() {
        HdlSocketHelper.send(getUdpBoot(), ip,UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() {
            @Override
            public void onSucceed(Object msg) {
                if (callBack == null) return;
@@ -293,7 +293,7 @@
     * @param callBack 回调
     */
    public void searchGatewayMulticast(SearchGatewayCallBack callBack) {
        searchGateway(HDLLinkConfig.getInstance().getGatewayId(),  InetSocketAddress.createUnresolved(UDP_GROUP_IP,UDP_PORT), callBack);
        searchGateway(HDLLinkConfig.getInstance().getGatewayId(), UDP_GROUP_IP,UDP_PORT, callBack);
    }
    /**
@@ -303,7 +303,7 @@
     */
    public void searchGatewayBroadcast(SearchGatewayCallBack callBack) {
        String ip = IpUtils.getBroadcastAddress();
        searchGateway(HDLLinkConfig.getInstance().getGatewayId(),  InetSocketAddress.createUnresolved(ip,UDP_PORT), callBack);
        searchGateway(HDLLinkConfig.getInstance().getGatewayId(),  ip,UDP_PORT, callBack);
    }
@@ -321,7 +321,7 @@
                GsonConvert.getGson().toJson(data));
        String ip = IpUtils.getBroadcastAddress();
        HdlSocketHelper.send(getUdpBoot(), InetSocketAddress.createUnresolved(ip,UDP_PORT), message, new HdlSocketHelper.HdlSocketListener() {
        HdlSocketHelper.send(getUdpBoot(), ip,UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() {
            @Override
            public void onSucceed(Object msg) {
                if (callBack == null) return;
@@ -353,8 +353,8 @@
            return;
        }
        LinkRequest message = new LinkRequest(topic, bodyStr);
        String ip = HDLLinkConfig.getInstance().getIpAddress(); IpUtils.getBroadcastAddress();
        HdlSocketHelper.send(getUdpBoot(), InetSocketAddress.createUnresolved(ip,UDP_PORT), message, new HdlSocketHelper.HdlSocketListener() {
        String ip = HDLLinkConfig.getInstance().getIpAddress();
        HdlSocketHelper.send(getUdpBoot(), ip, UDP_PORT, message, new HdlSocketHelper.HdlSocketListener() {
                    @Override
                    public void onSucceed(Object msg) {
                        if (callBack == null) return;
@@ -383,7 +383,7 @@
        }
        LinkRequest message = new LinkRequest(topic, bodyStr);
        String ip = HDLLinkConfig.getInstance().getIpAddress();// IpUtils.getBroadcastAddress();
        getUdpBoot().sendMsg( InetSocketAddress.createUnresolved(ip,UDP_PORT),message.getSendBytes());
        getUdpBoot().sendMsg( ip,UDP_PORT,message.getSendBytes());
    }
    private GatewaySearchBean getGatewaySearchBean(Object msg) {
@@ -513,10 +513,11 @@
     * 搜索指定网关是否在线,搜索到则返回指定的网关对象
     *
     * @param gatewayId 网关id
     * @param desInetSocketAddress        目标的地址
     * @param ipAddress        目标的IP地址
     * @param port 目标的端口
     * @param callBack  回调
     */
    public void searchGateway(String gatewayId, InetSocketAddress desInetSocketAddress, SearchGatewayCallBack callBack) {
    public void searchGateway(String gatewayId, String ipAddress,int port, SearchGatewayCallBack callBack) {
        this.searchGatewayId = gatewayId;
        this.mSearchGatewayCallBack = callBack;
        //重置参数
@@ -538,7 +539,7 @@
                        //搜索网关
                        searchGatewayCount.set(searchGatewayCount.get() + 1);
                        LogUtils.i("搜索网关", "搜索网关第" + searchGatewayCount.get() + "次");
                        getUdpBoot().sendMsg(desInetSocketAddress,message.getSendBytes());
                        getUdpBoot().sendMsg(ipAddress, port, message.getSendBytes());
                        Thread.sleep(1000L);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
@@ -548,11 +549,10 @@
                if (!isSearchGatewaySuccess.get()) {
                    //搜索10次,指定网关都没回复,回调超时
                    callBackSearchGatewayTimeout();
                    LogUtils.e("搜索网关--", "搜索10次,指定网关都没回复,回调超时");
                    LogUtils.e("搜索网关", "搜索10次,指定网关都没回复,回调超时");
                }
            }
        }).start();
    }
    /**
HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HDLSocket.java
@@ -558,14 +558,14 @@
                @Override
                public void onMessage(Object msg) {
                    if (msg instanceof LinkResponse) {
                        LogUtils.e("sendMsg onSuccess");
                        LogUtils.i("sendMsg onSuccess");
                        threadPool.shutdownNow();
                        LogUtils.i("sendMsg eventListener remove");
                        EventDispatcher.getInstance().remove(eventTag, this);
                        if (callBack != null) {
                            callBack.onSuccess(msg.toString());
                        }
                        threadPool.shutdownNow();
                    }
                    LogUtils.e("sendMsg eventListener remove");
                    EventDispatcher.getInstance().remove(eventTag, this);
                }
            };
@@ -591,6 +591,7 @@
                }
            }, 1000, 500, TimeUnit.MILLISECONDS);
            EventDispatcher.getInstance().register(eventTag, eventListener);
            //先发送一次
            getTcp().sendMsg(data, new SendListener() {
                @Override
                public void onSucceed() {
HDLSDK/hdl-connect/src/main/java/com/hdl/sdk/connect/socket/HdlSocketHelper.java
@@ -29,7 +29,14 @@
    private SocketBoot boot;
    private UdpSocketBoot udpSocketBoot;
    private InetSocketAddress inetSocketAddress;
    /**
     * 发送的目标IP
     */
    private String ipAddress;
    /**
     * 发送的目标地址
     */
    private int port;
    private final LinkRequest linkRequest;
    private final EventListener eventListener;
@@ -71,11 +78,12 @@
    }
    private HdlSocketHelper(Long sendAwaitTime, int maxRetry, UdpSocketBoot udpSocketBoot,
                            InetSocketAddress inetSocketAddress, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) {
                            String ipAddress,int port , LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) {
        this.sendAwaitTime = sendAwaitTime;
        this.maxRetry = maxRetry;
        this.udpSocketBoot = udpSocketBoot;
        this.inetSocketAddress = inetSocketAddress;
        this.ipAddress = ipAddress;
        this.port = port;
        this.linkRequest = linkRequest;
        this.listener = listener;
        this.sendNumber = new AtomicInteger(0);
@@ -120,16 +128,17 @@
     * Udp的发送方法
     *
     * @param udpSocketBoot     Udp当前对接
     * @param inetSocketAddress 发送的目标地址
     * @param ipAddress 发送的目标IP地址
     * @param port 目的端口
     * @param linkRequest       发送的数据
     * @param observeTopic      发送的主题
     * @param listener          回调
     */
    public static void send(UdpSocketBoot udpSocketBoot, InetSocketAddress inetSocketAddress, LinkRequest linkRequest, String observeTopic, HdlSocketListener listener) {
    public static void send(UdpSocketBoot udpSocketBoot, String  ipAddress ,int port, 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);
        HdlSocketHelper socketHelper = new HdlSocketHelper(DEF_SEND_TIMEOUT, DEF_SEND_ONE, udpSocketBoot, ipAddress,port, linkRequest, observeTopic, listener);
        socketHelper.send();
    }
@@ -137,16 +146,17 @@
     * Udp发送的方法
     *
     * @param udpSocketBoot     当前Udp对象
     * @param inetSocketAddress 发送的目标地址
     * @param ipAddress 发送的目标IP地址
     * @param
     * @param linkRequest       发送的对象
     * @param listener          回调
     */
    public static void send(UdpSocketBoot udpSocketBoot, InetSocketAddress inetSocketAddress, LinkRequest linkRequest, HdlSocketListener listener) {
    public static void send(UdpSocketBoot udpSocketBoot, String ipAddress ,int port, 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);
        HdlSocketHelper socketHelper = new HdlSocketHelper(DEF_SEND_TIMEOUT, DEF_SEND_ONE, udpSocketBoot, ipAddress,port, linkRequest, observeTopic, listener);
        socketHelper.send();
    }
@@ -166,7 +176,7 @@
                            }
                            //如果是udp
                            if (null != udpSocketBoot) {
                                udpSocketBoot.sendMsg(inetSocketAddress, linkRequest.getSendBytes());
                                udpSocketBoot.sendMsg(ipAddress,port, linkRequest.getSendBytes());
                            }
                        }
                    } catch (Exception e) {
HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/SocketPool.java
@@ -35,7 +35,7 @@
        mUdpClientPool.clear();
    }
    public synchronized DatagramSocket getUdpSocket1(InetSocketAddress address) throws SocketException {
    public synchronized DatagramSocket getUdpSocket(InetSocketAddress address) throws SocketException {
        DatagramSocket socket;
        final String key = address.toString();
        if (mUdpClientPool.containsKey(key)) {
HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/IUdpClient.java
@@ -4,6 +4,7 @@
import com.hdl.sdk.socket.udp.UdpSocketOptions;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
/**
 * Created by hxb on 2021/12/12.
@@ -31,10 +32,11 @@
    /**
     * 发送数据
     * @param inetSocketAddress 目标地址
     * @param ipAddress 目标IP
     * @param port 端口
     * @param msg 发送数据
     * @throws Exception
     */
    void sendMsg(InetSocketAddress inetSocketAddress, byte[] msg) throws Exception;
    void sendMsg(String ipAddress,int port, byte[] msg) throws Exception;
}
HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/client/UdpClient.java
@@ -17,6 +17,7 @@
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -98,7 +99,7 @@
                return;
            }
            if (TextUtils.isEmpty(ipAddress)) {
                mSocket = SocketPool.getInstance().getUdpSocket1(new InetSocketAddress(port));
                mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(port));
            }
            mSocket.setBroadcast(true);
            mSocket.setReuseAddress(true);
@@ -122,15 +123,16 @@
    @Override
    public UdpSocketOptions getOptions() {
        return null;
        return this.socketOptions;
    }
    @Override
    public void onHandleResponse() throws Exception {
        if (mSocket == null) {
            return;
        }
        try {
           mSocket.receive(receivePacket);
            mSocket.receive(receivePacket);
        } catch (IOException e) {
            e.printStackTrace();
        }
@@ -139,14 +141,14 @@
        }
        //排除自己发出去的
        try {
            if (IpUtils.isLocalIpAddress( receivePacket.getAddress().getHostAddress()))
            if (IpUtils.isLocalIpAddress(receivePacket.getAddress().getHostAddress()))
                return;
        } catch (Exception ignored) {
        }
        try {
            LogUtils.i( "接收到Udp数据包,网络地址:" + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort());
            LogUtils.i("接收到Udp数据包,网络地址:" + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort());
            IHandleMessage handleMessage = getOptions().getHandleMessage();
            if (handleMessage != null) {
@@ -155,17 +157,18 @@
                handleMessage.read(data);
            }
        }catch (Exception e){
        } catch (Exception e) {
        }
    }
    @Override
    public void sendMsg(InetSocketAddress inetSocketAddress, byte[] msg) throws Exception {
    public void sendMsg(String ipAddress,int port, byte[] msg) throws Exception {
        if (msg == null) {
            return;
        }
        final DatagramPacket sendPacket = new DatagramPacket(msg, msg.length, inetSocketAddress);
        final DatagramPacket sendPacket = new DatagramPacket(msg, msg.length, InetAddress.getByName(ipAddress), port);
        mSocket.send(sendPacket);
    }
}
HDLSDK/hdl-socket/src/main/java/com/hdl/sdk/socket/udp/UdpSocketBoot.java
@@ -13,7 +13,9 @@
import com.hdl.sdk.socket.listener.SendListener;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingDeque;
@@ -33,6 +35,8 @@
    private final AtomicInteger resendCount = new AtomicInteger(0);
    private ExecutorService receiveThread;
    private final ArrayMap<String, SendListener> sendMap = new ArrayMap<>();
    public UdpSocketBoot(IUdpClient client) {
@@ -44,38 +48,63 @@
     * @throws Exception 可能端口冲突
     */
    public void bind() throws Exception {
        if (null != client) {
            client.bind();
        }
        client.bind();
        initReceiveThread();
    }
    /**
     * 初始化接收线程
     */
    private void initReceiveThread() {
        if(null!=receiveThread){
            return;
        }
        receiveThread = ThreadToolUtils.getInstance().newFixedThreadPool(1);
        receiveThread.execute(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        client.onHandleResponse();
                    } catch (Exception e) {
                       LogUtils.i("接收线程异常:"+e.getMessage());
                    }
                }
            }
        });
    }
    /**
     * 发送数据
     * @param inetSocketAddress 目的的IP地址
     * @param ipAddress 目的的IP地址
     * @param port 端口
     * @param msg 发送数据
     * @param listener 发送回调
     */
    public void sendMsg(InetSocketAddress inetSocketAddress,byte[] msg, SendListener listener) {
        sendMsg(inetSocketAddress, msg, true, listener);
    public void sendMsg(String ipAddress,int port,byte[] msg, SendListener listener) {
        sendMsg(ipAddress,port, msg, true, listener);
    }
    /**
     * 发送数据
     * @param inetSocketAddress 目的的IP地址
     * @param ipAddress 目的的IP地址
     * @param port 端口
     * @param msg 发送数据
     */
    public void sendMsg(InetSocketAddress inetSocketAddress,byte[] msg) {
        sendMsg(inetSocketAddress, msg, true, null);
    public void sendMsg(String ipAddress,int port,byte[] msg) {
        sendMsg(ipAddress,port, msg, true, null);
    }
    /**
     * 发送数据
     * @param inetSocketAddress 目的IP地址
     * @param ipAddress 目的IP地址
     * @param port 端口
     * @param msg 发送的数据
     * @param isRefreshRetry 是否要重发
     * @param listener 发送回调
     */
    public void sendMsg(InetSocketAddress inetSocketAddress, byte[] msg, boolean isRefreshRetry, SendListener listener) {
    public void sendMsg(String ipAddress,int port, byte[] msg, boolean isRefreshRetry, SendListener listener) {
        if (isRefreshRetry) {
            //重置连接次数
            resendCount.set(0);
@@ -85,7 +114,7 @@
            if (listener != null && !TextUtils.isEmpty(request.getAction())) {
                sendMap.put(request.getAction(), listener);
            }
            client.sendMsg(inetSocketAddress, msg);
            client.sendMsg(ipAddress,port, msg);
        } catch (Exception e) {
            LogUtils.i("发送失败:" + e.getMessage());
        }
@@ -96,8 +125,9 @@
     */
    public synchronized void close() {
        isOpenRetry.set(false);
        sendMap.clear();
        receiveThread.shutdown();
        receiveThread=null;
        client.close();
    }
}