package com.hdl.sdk.link.socket.udp;  
 | 
  
 | 
import android.text.TextUtils;  
 | 
  
 | 
import androidx.collection.ArrayMap;  
 | 
  
 | 
import com.hdl.sdk.link.common.utils.LogUtils;  
 | 
import com.hdl.sdk.link.common.utils.ThreadToolUtils;  
 | 
import com.hdl.sdk.link.socket.listener.SendListener;  
 | 
import com.hdl.sdk.link.socket.SocketRequest;  
 | 
import com.hdl.sdk.link.socket.client.IUdpClient;  
 | 
  
 | 
import java.util.concurrent.ExecutorService;  
 | 
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 ExecutorService receiveThread;  
 | 
  
 | 
    private final ArrayMap<String, SendListener> sendMap = new ArrayMap<>();  
 | 
  
 | 
  
 | 
    public IUdpClient getClient() {  
 | 
        return client;  
 | 
    }  
 | 
  
 | 
    public UdpSocketBoot(IUdpClient client) {  
 | 
        this.client = client;  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 绑定 socket  
 | 
     * @throws Exception 可能端口冲突  
 | 
     */  
 | 
    public void bind() throws Exception {  
 | 
        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 ipAddress 目的的IP地址  
 | 
     * @param port 端口  
 | 
     * @param msg 发送数据  
 | 
     * @param listener 发送回调  
 | 
     */  
 | 
    public void sendMsg(String ipAddress,int port,byte[] msg, SendListener listener) {  
 | 
        sendMsg(ipAddress,port, msg, true, listener);  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 发送数据  
 | 
     * @param ipAddress 目的的IP地址  
 | 
     * @param port 端口  
 | 
     * @param msg 发送数据  
 | 
     */  
 | 
    public void sendMsg(String ipAddress,int port,byte[] msg) {  
 | 
        sendMsg(ipAddress,port, msg, true, null);  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 发送数据  
 | 
     * @param ipAddress 目的IP地址  
 | 
     * @param port 端口  
 | 
     * @param msg 发送的数据  
 | 
     * @param isRefreshRetry 是否要重发  
 | 
     * @param listener 发送回调  
 | 
     */  
 | 
    public void sendMsg(String ipAddress,int port, 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(ipAddress,port, msg);  
 | 
        } catch (Exception e) {  
 | 
            LogUtils.e("发送失败:" + e.getMessage());  
 | 
        }  
 | 
    }  
 | 
  
 | 
    /**  
 | 
     * 关闭当前socket  
 | 
     */  
 | 
    public synchronized void close() {  
 | 
        isOpenRetry.set(false);  
 | 
        sendMap.clear();  
 | 
        receiveThread.shutdown();  
 | 
        receiveThread=null;  
 | 
        client.close();  
 | 
    }  
 | 
}  
 |