wjc
2023-06-28 14de918a79943e4961b09fa01ed320c6cad41f2e
HDLLinkLocalSdk/src/main/java/com/hdl/sdk/link/socket/client/UdpClient.java
New file
@@ -0,0 +1,191 @@
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();
        }
    }
}