Java UDP通信
2020年2月25日
突然发现之前用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向客户端发送。
Previous
接雨水(leetcode_42)
Newer