【簡單封裝】UDP服務端

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);
    }
}

主函數使用

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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章