《Java网络编程》使用UDP实现daytime协议,总结其交互过程
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); } } }
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(); } } }