package com.hdl.sdk.socket.client; import android.text.TextUtils; import com.hdl.sdk.common.utils.IpUtils; import com.hdl.sdk.common.utils.LogUtils; import com.hdl.sdk.socket.SocketBoot; import com.hdl.sdk.socket.SocketOptions; import com.hdl.sdk.socket.SocketPool; import com.hdl.sdk.socket.udp.UdpSocketBoot; import com.hdl.sdk.socket.udp.UdpSocketOptions; import com.hdl.sdk.socket.codec.IHandleMessage; 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.concurrent.atomic.AtomicBoolean; /** * Created by hxb on 2021/12/12. */ public class UdpClient implements IUdpClient { /** * 当前socket */ 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; byte[] receiveByte = new byte[BUFFER]; receivePacket = new DatagramPacket(receiveByte, receiveByte.length); } /** * 初始化参数 * @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)); } /** * 初始化参数 * @param port 本地监听端口 * @param options * @return */ public static UdpSocketBoot init(int port, UdpSocketOptions options) { return init(null, port, options); } @Override public void bind() throws Exception { try { //已经绑定过就不用再绑定 if (null != mSocket) { return; } if (TextUtils.isEmpty(ipAddress)) { mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(port)); } mSocket.setBroadcast(true); mSocket.setReuseAddress(true); } catch (Exception e) { LogUtils.e("初始化Socket 失败:" + e.getMessage()); throw e; } } @Override public boolean close() { try { mSocket.close(); } catch (Exception e) { } mSocket = null; return true; } @Override public UdpSocketOptions getOptions() { return this.socketOptions; } @Override public void onHandleResponse() throws Exception { if (mSocket == null) { return; } try { mSocket.receive(receivePacket); } catch (IOException e) { e.printStackTrace(); } if (receivePacket.getLength() == 0) { return; } //排除自己发出去的 try { if (IpUtils.isLocalIpAddress(receivePacket.getAddress().getHostAddress())) return; } catch (Exception ignored) { } try { LogUtils.i("接收到Udp数据包,网络地址:" + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort()); 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,receivePacket.getAddress().getHostAddress()); } } catch (Exception e) { } } @Override public void sendMsg(String ipAddress,int port, byte[] msg) throws Exception { if (msg == null) { return; } final DatagramPacket sendPacket = new DatagramPacket(msg, msg.length, InetAddress.getByName(ipAddress), port); mSocket.send(sendPacket); } }