Java Socket的几种通信示例(UDP)

UDP简介

java.net.ServerSocket和java.net.Socket是建立在TCP协议基础上。TCP协议传输可靠,但是速度没有UDP快。
UDP的缺点是不可靠,无法保证数据一定能够到达目的地,和目标接收数据包的顺序。
UDP适合传输视频、音频。而TCP适合可靠的协议应用,比如FTP、HTTP。
UDP在java中的api主要是java.util.DatagramSocket类。每个DatagramSocket与一个本地地址绑定,每个DatagramSocket可以把UDP数据包发给任意一个远程DatagramSocket,也可以接收来自任意一个远程DatagramSocket的UDP数据包。

TCP通信必须Client和Server先建立连接,UDP不用建立连接,直接发送数据包。

示例

public class EchoServer {
    private int port = 8000;
    private DatagramSocket socket;

    public EchoServer() throws IOException {
        socket = new DatagramSocket(port); //与本地的一个固定端口绑定
        System.out.println("服务器启动");
    }

    public String echo(String msg) {
        return "echo:" + msg;
    }

    public void service() {
        while (true) {
            try {
                byte[] buf = new byte[512];
                DatagramPacket packet = new DatagramPacket(buf, buf.length);
                socket.receive(packet);  //接收来自任意一个EchoClient的数据报
                String msg = new String(packet.getData(), 0, packet.getLength());
                System.out.println(packet.getAddress() + ":" + packet.getPort() + ">" + msg);

                //给EchoClient回复一个数据报
                packet.setData(echo(msg).getBytes());
                socket.send(packet);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String args[]) throws IOException {
        new EchoServer().service();
    }
}
public class EchoClient {
    private String remoteHost = "localhost";
    private int remotePort = 8000;
    private DatagramSocket socket;

    public EchoClient() throws IOException {
        socket = new DatagramSocket(); //与本地的任意一个UDP端口绑定
    }

    public static void main(String args[]) throws IOException {
        new EchoClient().talk();
    }

    public void talk() throws IOException {
        try {
            InetAddress remoteIP = InetAddress.getByName(remoteHost);

            BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
            String msg = null;
            while ((msg = localReader.readLine()) != null) {
                byte[] outputData = msg.getBytes();
                DatagramPacket outputPacket = new DatagramPacket(outputData,
                        outputData.length, remoteIP, remotePort);
                socket.send(outputPacket);  //给EchoServer发送数据报

                byte[] bytes = new byte[512];
                DatagramPacket inputPacket = new DatagramPacket(bytes, bytes.length);
                socket.receive(inputPacket);
                System.out.println(new String(inputPacket.getData(), 0, inputPacket.getLength()));
                if (msg.equals("bye")) {
                  break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            socket.close();
        }
    }
} 
发布了55 篇原创文章 · 获赞 6 · 访问量 889

猜你喜欢

转载自blog.csdn.net/smith789/article/details/104342086