《Java网络编程》使用UDP实现daytime协议,总结其交互过程
1. DaytimeUDPServer
package jnp4.UDP;
import java.net.*;
import java.util.Date;
import java.util.logging.*;
import java.io.*;
public class DaytimeUDPServer {
private final static int PORT = 2036;
private final static Logger audit = Logger.getLogger("requests");
private final static Logger errors = Logger.getLogger("errors");
public static void main(String[] args) {
try (DatagramSocket socket = new DatagramSocket(PORT)) {
while (true) {
try {
//创建一个将接收请求的数据包。要提供一个将存储入站数据的byte数组,
//数组中的偏移量,以及要存储的字节数
DatagramPacket request = new DatagramPacket(new byte[1024], 1024);
//接收这个数据包
/*这个调用会无限阻塞,直到一个UDP数据包到达端口13。
如果有UDP数据包到达, Java就会将这个数据填充在byt巳数组中, receive ()方法返回。*/
socket.receive(request);
String daytime = new Date().toString();
byte[] data = daytime.getBytes("US-ASCII");
/*然后再创建一个响应数据包。这包括4个部分:要发送的原始数据、待发送原始数据的
字节数、要发送到哪个主机,以及发送到该主机上哪个端口。*/
DatagramPacket response = new DatagramPacket(data, data.length,
request.getAddress(), request.getPort());
//通过接收数据包的同一个Socket发回响应
socket.send(response);
audit.info(daytime + " " + request.getAddress());
} catch (IOException | RuntimeException ex) {
errors.log(Level.SEVERE, ex.getMessage(), ex);
}
}
} catch (IOException ex) {
errors.log(Level.SEVERE, ex.getMessage(), ex);
}
}
}
2. DaytimeUDPClient
package jnp4.UDP;
import java.io.*;
import java.net.*;
public class DaytimeUDPClient {
private final static int PORT = 2036;
private static final String HOSTNAME = "localhost";
public static void main(String[] args) {
//在端口O打开一个Socket 这与TCP socket有很大不同
//你只需要指定要连接的一个本地端口。Socket并不知道远程主机或地址是什么
//
try (DatagramSocket socket = new DatagramSocket(0)) {
//在连接上设置一个超时时间
socket.setSoTimeout(10000);
InetAddress host = InetAddress.getByName(HOSTNAME);
/*接下来需要建立数据包。你要建立两个数据包, 一个是要发送的数据包,另一个是要接
收的数据包。*/
DatagramPacket request = new DatagramPacket(new byte[1], 1, host, PORT);
DatagramPacket response = new DatagramPacket(new byte[1024], 1024);
socket.send(request);
socket.receive(response);
//从响应中提取字节,将它们转换为可以显示给最终用户的字符串:
String result = new String(response.getData(), 0, response.getLength(),
"US-ASCII");
System.out.println(result);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}