UDP编程

TCP与UDP区别

TCP特点 面向连接,传输可靠,速度比udp慢。适用于传输大量的数
据,对可靠性要求较高的场景;

UDP特点 面向无连接,传输不可靠,速度快。传送少量数据、对可靠性要求不高的场景。

基于Socket的UDP编程

TCP通信中包含服务端和客户端,下面分别讲述。

服务端

第一步 创建DatagramSocket对象(指定要监听的端口);
第二步 调用DatagramSocket的receive方法接收客户端发过来的数据包,客户端发过来的数据包是一个DatagramPacket类型,通过DatagramPacket可以获取到客户端使用的端口和地址。

下面贴上代码:

public class UdpServer extends Base {
    private DatagramSocket mSocket;

    private boolean mIsStop;

    UdpServer(BaseListener listener) {
        super(listener);
    }

    public void start() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    mIsStop = false;

                    mSocket = new DatagramSocket(9090);
                    while (!mIsStop) {
                        recv();
                    }
                } catch (SocketException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public void stop() {
        mIsStop = true;
        if (mSocket == null) {
            return;
        }

        mSocket.close();
        mSocket = null;
    }

    public boolean send(@NonNull final DatagramPacket packet, @NonNull final String content) {
        if (mSocket == null) {
            return false;
        }

        new Thread(new Runnable() {
            @Override
            public void run() {
                byte[] bytes = content.getBytes();
                try {
                    mSocket.send(new DatagramPacket(bytes, bytes.length, packet.getAddress(),
                            packet.getPort()));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        return true;
    }

    private void recv() {
        if (mSocket == null) {
            return;
        }

        byte[] bytes = new byte[1024];
        DatagramPacket mRecvPacket = new DatagramPacket(bytes, bytes.length);
        try {
            mSocket.receive(mRecvPacket);
            mHandler.sendMsgRecv(new String(bytes));

            send(mRecvPacket, "hello world " + new Date().toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端

第一步 创建DatagramSocket对象;
第二步 调用DatagramSocket的send方法发送数据包到服务端,数据包是DatagramPacket类型。

下面贴上代码:

public class UdpClient extends Base {
    private DatagramSocket mSocket;
    private boolean mIsStop;

    UdpClient(BaseListener listener) {
        super(listener);
    }

    public void start() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    mIsStop = false;

                    mSocket = new DatagramSocket();
                    while (!mIsStop) {
                        recv();
                    }
                } catch (SocketException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    public void stop() {
        mIsStop = true;
        if (mSocket == null) {
            return;
        }

        mSocket.close();
        mSocket = null;
    }

    public boolean send(@NonNull final String content) {
        if (mSocket == null) {
            return false;
        }

        new Thread(new Runnable() {
            @Override
            public void run() {
                byte[] bytes = content.getBytes();
                try {
                    InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
                    mSocket.send(new DatagramPacket(bytes, bytes.length, inetAddress, 9090));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        return true;
    }

    private void recv() {
        if (mSocket == null) {
            return;
        }

        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
        try {
            mSocket.receive(packet);
            mHandler.sendMsgRecv(new String(bytes));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(UDP编程)