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 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 目的的IP地址 * @param msg 发送数据 * @param listener 发送回调 */ public void sendMsg(InetSocketAddress inetSocketAddress,byte[] msg, SendListener listener) { sendMsg(inetSocketAddress, msg, true, listener); } /** * 发送数据 * @param inetSocketAddress 目的的IP地址 * @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(); } }