未分类

Java UDP通信

突然发现之前用java写通信的时候完全没想过很多问题,还是分布式老师专业点,基本上把java的socket讲的轮回贯通了。

用java实现udp通信很简单,基本就是建立一个socket,然后直接发就行了,没有那么多稀奇古怪的操作。基本上就和go语言的一样,一般来说的话通信的服务端有几种实现方式,或者是多线程,或者是while循环阻塞。我个人感觉,udp的话,没必要用多线程,直接发就行了。

现在直接发代码吧。

UDP通信客户端


import java.net.*;
import java.io.*;

public class UDPClient{
public static void main(String args[]){
// args give message contents and server hostname
    DatagramSocket aSocket = null;
    try {
        aSocket = new DatagramSocket();
        byte[] m = args[0].getBytes();
        InetAddress aHost = InetAddress.getByName("127.0.0.1");
        int serverPort = 6789;
        DatagramPacket request = new DatagramPacket(m, m.length, aHost, serverPort);
        aSocket.send(request);
        byte[] buffer = new byte[1000];
        DatagramPacket reply = new DatagramPacket(buffer, buffer.length);
        aSocket.receive(reply);
        System.out.println("Reply: " + new String(reply.getData()));
    } catch (SocketException e){
        System.out.println("Socket: " + e.getMessage());
    } catch (IOException e){
        System.out.println("IO: " + e.getMessage());
    } finally {
        if(aSocket != null) aSocket.close();
    }
}
}

UDP通信服务端


import java.net.*;
import java.io.*;

public class UDPServer {
    public static void main(String args[]) {
        DatagramSocket aSocket = null;
        int serverPort = 6789;
        try {
            aSocket = new DatagramSocket(serverPort);
            byte[] buffer = new byte[1000];
            while (true) {
                DatagramPacket request = new DatagramPacket(buffer, buffer.length);
                aSocket.receive(request);
                System.out.println("fuck");
                DatagramPacket reply = new DatagramPacket(request.getData(), request.getLength(), request.getAddress(),
                        request.getPort());
                aSocket.send(reply);
            }
        } catch (SocketException e) {
            System.out.println("Socket: " + e.getMessage());
        } catch (IOException e) {
            System.out.println("IO: " + e.getMessage());
        } finally {

            if (aSocket != null)
                aSocket.close();
        }
    }
}

这里我们可以看出,在UDP通信中,发送的包是我们自己根据一个byte数组构建一个DatagramPacket,然后通过我们构建的socket进行发送和接收操作。但是我们可以看到,我们这发送和接收的socket是同一个socket,构建socket是通过DatagramSocket,不同的是客户端的socket没有直接指定端口,而是通过Packet里面直接指定服务端的IP地址和端口然后发送的。在服务端,我们可以通过端口直接构建和端口绑定的socket,这个socket是可以直接进行receive的,然后接收到后我们接收到后可以根据发送来的packet解析出客户端的IP地址以及端口(客户端发送不需要指定是从哪个端口发的,所以会随机分配一个端口),然后和客户端构建packet一样,根据这个端口构建packet,再通过服务端的socket向客户端发送。

Leave a Reply

邮箱地址不会被公开。 必填项已用*标注