[Simple Encapsulation] UDP server

PZHelp_UDPServer

public class PZHelp_UDPServer extends Thread {
    
    
    private static final String TAG = "PZHelp_UDPServer";

    private DatagramSocket socket;
    private DatagramPacket packet;
    private int            port;

    private boolean isUDPServerRunning;

    private ByteReceiveListener   byteListener = null;
    private StringReceiveListener strListener  = null;

    private int receiveType;

    public PZHelp_UDPServer(int port, ByteReceiveListener listener) {
    
    
        this.port = port;
        this.byteListener = listener;
        receiveType = 1;
        byte[] data = new byte[2048];
        packet = new DatagramPacket(data, data.length);
    }

    public PZHelp_UDPServer(int port, StringReceiveListener listener) {
    
    
        this.port = port;
        this.strListener = listener;
        receiveType = 2;
        byte[] data = new byte[2048];
        packet = new DatagramPacket(data, data.length);
    }

    @Override
    public synchronized void start() {
    
    
        super.start();
        isUDPServerRunning = true;
    }

    @Override
    public void run() {
    
    
        try {
    
    
            socket = new DatagramSocket(port);
            while (isUDPServerRunning && !socket.isClosed()) {
    
    
                socket.receive(packet);//阻塞状态
                if (receiveType == 1){
    
    
                    byteListener.Receive(packet.getAddress().toString(), getByteArr(packet.getData(), packet.getOffset(), packet.getLength()));
                }else {
    
    
                    //接收字符串
                    strListener.Receive(packet.getAddress().toString(),new String(packet.getData(), 0, packet.getLength(),"GBK"));
                }
            }
            socket.close();
        } catch (Exception e) {
    
    
            if (receiveType == 1){
    
    
                byteListener.onFail(e.getMessage());
            }else {
    
    
                //接收字符串
                strListener.onFail(e.getMessage());
            }
        }
    }

    /**
     * 发送数据
     *
     * @param message 数据
     */
    public void send(String message) {
    
    
        try {
    
    
            if (isUDPServerRunning && !socket.isClosed()) {
    
    
                socket.send(new DatagramPacket(message.getBytes(), message.length(), packet.getAddress(), packet.getPort()));
            }
        } catch (IOException e) {
    
    
            byteListener.onFail(e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 发送数据
     *
     * @param message 数据
     */
    public void send(byte[] message) {
    
    
        try {
    
    
            if (isUDPServerRunning && !socket.isClosed()) {
    
    
                socket.send(new DatagramPacket(message, message.length, packet.getAddress(), packet.getPort()));
            }
        } catch (IOException e) {
    
    
            byteListener.onFail(e.getMessage());
            e.printStackTrace();
        }
    }

    private byte[] getByteArr(byte[] data, int start, int length) {
    
    
        byte[] ret = new byte[length];
        System.arraycopy(data, start, ret, 0, length);
        return ret;
    }

    void close() {
    
    
        isUDPServerRunning = false;
    }

    /**
     * 回调
     */
    public interface ByteReceiveListener {
    
    
        void onFail(String err);

        void Receive(String address, byte[] response);
    }

    /**
     * 回调
     */
    public interface StringReceiveListener {
    
    
        void onFail(String err);

        void Receive(String address, String response);
    }
}

Main function use

mUDPServer = new PZHelp_UDPServer(3232, new PZHelp_UDPServer.StringReceiveListener() {
    
    
     @Override
     public void onFail(String err) {
    
    
         Log.d(TAG, "onFail: " + err);
     }

     @Override
     public void Receive(String address, String response) {
    
    
     	//处理数据
     }
 });
 mUDPServer.start();

Guess you like

Origin blog.csdn.net/qq_36881363/article/details/105450021