New file |
| | |
| | | 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("0.0.0.0", port, options); |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public void bind() throws Exception { |
| | | try { |
| | | //已经绑定过就不用再绑定 |
| | | if (null != mSocket) { |
| | | return; |
| | | } |
| | | if (TextUtils.isEmpty(ipAddress)) { |
| | | mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(port)); |
| | | }else { |
| | | mSocket = SocketPool.getInstance().getUdpSocket(new InetSocketAddress(ipAddress,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); |
| | | } |
| | | } |