《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
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值