UDPping程序
要求:
在这个编程作业中,你将用 Java 编写一个客户ping程序。该客户将发送一个简单的ping报文,接收一个从服务器返回的对应pong报文,并确定从该客户发送ping报文到接收到pong报文为止的时延。 该时延称为往返时延(RTT)。由该客户和服务器提供的功能类似于在现代操作系统中可用的标准ping程序。然而,标准的ping使用互联网控制报文协议(ICMP)(我们将在第5章中学习ICMP). 此时我们将创建一个非标准(但简单)的基于UDP的ping程序。
你的ping程序经UDP向目标服务器发送10个ping报文。对于每个报文,当对应的pong报文返回时,你的客户要确定和打印RTT。因为UDP是一个不可靠的协议,由客户发送的分组可能会丢失。为此,客户不能无限期地等待对ping报文的回答。客户等待服务器回答的时间至多为1秒;如果没有收到回答,客户假定该分组丢失并相应地打印一条报文。
在此作业中,你将给出服务器的完整代码(在配套网站中可找到)。你的任务是编写客户代码,该代码与服务器代码非常类似。建议你先仔细学习服务器的代码,然后编写你的客户代码,可以随意地从服务器代码中剪贴代码行。
电脑内置的ping程序示例:
梳理题目之后,结合电脑中的ping程序示例,我们给出UDPServer的功能和UDPClient的功能
Server
- 显示用户通过客户端发送来的消息内容(包含头部和payload)
- 能够模拟分组的丢失;能够模拟分组传输延迟;
- 将Client发送来的请求在延迟一段随机选择的时间(小于1s)后返回给客户端,作为收到请求的响应reply;
Client
- 启动后发送10个request。发送一个request后,最多等待1秒以便接收server返回的消息。如果在1s内没有收到服务器的reply,则认为该请求或对该请求的reply已经丢失
- 在收到reply后立即发送下一个请求。
- 请求消息的payload中包含关键字PingUDP、序号、时间戳这些内容
- 计算传包总数,收到包的总数以及丢包率
- 为每个请求计算折返时间(RTT),统计10个请求的min/avg/maxRTT。
代码
我把这个项目写成了两个project:pingserver和pingclient,分别启动,更加直观一些
pingserver
PingServer类
1 | package com.company; |
ServerThread类
1 | package com.company; |
pingclient
PingClient类
1 | package com.company; |
CloseUtil
这个小组件是两个project都的,作用是用来关闭IO流的
1 | package com.company; |
效果如下图所示: