package com.hdl.sdk.link.socket.client; import android.net.wifi.WifiManager; import android.text.TextUtils; import com.hdl.sdk.link.common.utils.LogUtils; import com.hdl.sdk.link.core.protocol.LinkMessageDecoder; import com.hdl.sdk.link.socket.SocketPool; import com.hdl.sdk.link.socket.bean.Packet; import com.hdl.sdk.link.socket.udp.UdpSocketBoot; import com.hdl.sdk.link.socket.udp.UdpSocketOptions; import com.hdl.sdk.link.socket.codec.IHandleMessage; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.Inet4Address; import java.net.InetAddress; import java.net.InetSocketAddress; /** * 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; WifiManager.MulticastLock lock; /** * 初始化参数 * @param ipAddress 本地监听端口 * @param port 本地监听端口 * @param socketOptions */ public 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); this.lock= socketOptions.getWifiManager().createMulticastLock("UDPwifi"); } /** * 初始化参数 * @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("0.0.0.0", port, options); } @Override public synchronized void bind() throws Exception { try { //已经绑定过就不用再绑定 if (null != mSocket) { return; } lock.acquire(); if (TextUtils.isEmpty(ipAddress)) { mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(Inet4Address.getByName("0.0.0.0"), port)); } else{ mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(Inet4Address.getByName(ipAddress), port)); } mSocket.setBroadcast(true); // mSocket.setReuseAddress(true); } catch (Exception e) { 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 (Exception e) { LogUtils.e("接收到Udp数据包异常,异常信息:" + e.getMessage()); return; } if (receivePacket.getLength() == 0) { LogUtils.i("接收到Udp数据包,数据包长度为0:" + receivePacket.getAddress().getHostAddress() + ":" + receivePacket.getPort()); 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(new Packet(receivePacket.getAddress().getHostAddress(), data,null)); // } byte[] data = new byte[receivePacket.getLength()]; System.arraycopy(receivePacket.getData(), 0, data, 0, data.length); socketOptions.getHandleMessage().read(new Packet(data)); } catch (Exception e) { LogUtils.i("接收到Udp数据包,处理异常:" + e.getMessage()); } } @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); if (mSocket != null) { mSocket.send(sendPacket); } else { DatagramSocket datagramSocket = new DatagramSocket(); datagramSocket.send(sendPacket); datagramSocket.close(); } } }