《Java网络编程》使用UDP实现daytime协议的客户端与服务器交互过程

《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();
        }
    }
}

 

3. 交互过程

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我无法打开您提供的文档。但是,我可以为您提供DAYTIME协议服务器客户端程序的实现DAYTIME协议是一个简单的协议,它允许客户端服务器交换当前日期和时间信息。服务器会将当前日期和时间以字符串形式发送给客户端。下面是DAYTIME协议服务器客户端程序的实现DAYTIME协议服务器程序实现: ```python import socket from datetime import datetime server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = '' port = 13 server_socket.bind((host, port)) server_socket.listen(5) print("Server listening on port ", port) while True: client_socket, address = server_socket.accept() print("Connection from ", address) current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") client_socket.send(current_time.encode()) client_socket.close() ``` DAYTIME协议客户端程序实现: ```python import socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) host = 'localhost' port = 13 client_socket.connect((host, port)) data = client_socket.recv(1024) print("Current date and time: ", data.decode()) client_socket.close() ``` 在服务器端,我们首先创建一个套接字并绑定到本地主机和指定的端口。然后,我们开始监听客户端连接请求。一旦我们接受客户端连接请求,我们获取当前日期和时间并将其作为字符串发送给客户端。最后,我们关闭客户端套接字并继续等待其他客户端连接。 在客户端端,我们创建一个套接字并连接到服务器的主机和端口。一旦连接成功,我们接收从服务器发送的日期和时间信息并将其打印出来。最后,我们关闭客户端套接字。 这就是DAYTIME协议服务器客户端程序的实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值