题目要求
- 客户端输入ping 1-10,服务器端人工模拟UDP的丢包。
- 如果时间超过1s,则表示该包丢了,显示超时
- 如果没有丢包,则输出服务器返回的数据,并且输出RTT
服务器代码
这个代码是教程配套网站已经有的。我是从myk502的GitHub下载的。
import random
from socket import *
HOST = ''
PORT = 12001
BUFSIZE = 1024
ADDR = (HOST, PORT)
udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)
while True:
print('wating for connection...')
data, addr = udpSerSock.recvfrom(BUFSIZE)
rand = random.randint(0, 10)
print(rand, addr)
data = data.upper()
if rand < 4: #人工模拟丢包
continue
udpSerSock.sendto(data, addr)
udpSerSock.close()
客户端代码
from socket import *
from time import *
from datetime import *
HOST = '127.0.0.1'
PORT = 12001
BUFSIZE = 1024
ADDR = (HOST, PORT)
TIMEOUT = 1
udpCliSock = socket(AF_INET, SOCK_DGRAM)
udpCliSock.settimeout(TIMEOUT)
for i in range(0, 10):
data = input('> ')
if not data:
break
try:
begin_time = datetime.now()
udpCliSock.sendto(data.encode(), ADDR)
data, ADDR = udpCliSock.recvfrom(BUFSIZE)
end_time = datetime.now()
if data:
print('Response: ', data)
time = (end_time - begin_time).microseconds #微秒
print('RTT: ', time, 'ms')
except Exception as e:
print(e)
#print('Request timed out')
udpCliSock.close()
运行过程
参考书籍:《Python核心编程》,《计算机网络》