第1关:Ping服务端创建UDP套接字
略。
第2关:接收并转发消息
from socket import *
# 创建UDP套接字
serverSocket = socket(AF_INET, SOCK_DGRAM)
# 绑定本机IP地址和端口号
serverSocket.bind(('', 12000))
########## Begin ##########
# 接收客户端消息
message, address = serverSocket.recvfrom(2048)
# 将数据包消息转换为大写
message = message.upper()
#将消息传回给客户端
serverSocket.sendto(message, address)
########## End ##########
第3关:服务端模拟丢包事件
from socket import *
import random
# 创建UDP套接字
serverSocket = socket(AF_INET, SOCK_DGRAM)
# 绑定本机IP地址和端口号
serverSocket.bind(('', 12000))
num=0
while True:
# 接收客户端消息
message, address = serverSocket.recvfrom(1024)
# 将数据包消息转换为大写
message = message.upper()
num=num+1
if num>=8:
break
########## Begin #########
if num%3==1:
continue;
########## End ##########
#将消息传回给客户端
serverSocket.sendto(message, address)
第4关:客户端创建UDP套接字
from socket import *
########## Begin ##########
clientSocket = socket(AF_INET, SOCK_DGRAM) # 创建UDP套接字,使用IPv4协议
# 设置套接字超时值1秒
clientSocket.settimeout(1)
########## End ##########
print(clientSocket)
print(clientSocket.gettimeout())
第5关:客户端向服务器发送消息并接收消息
from socket import *
import time
serverName = '127.0.0.1' # 服务器地址,本例中使用本机地址
serverPort = 12000 # 服务器指定的端口
clientSocket = socket(AF_INET, SOCK_DGRAM) # 创建UDP套接字,使用IPv4协议
clientSocket.settimeout(1) # 设置套接字超时值1秒
for i in range(0, 9):
sendTime = time.time()
message = ('Ping %d %s' % (i+1, sendTime)).encode() # 生成数据报,编码为bytes以便发送
try:
########## Begin ##########
# 将信息发送到服务器
#clientSocket.sendto(modifiedMessage, serverAddress)
clientSocket.sendto(message, (serverName, serverPort))
# 从服务器接收信息,同时也能得到服务器地址
modifiedMessage, serverAddress = clientSocket.recvfrom(1024)
########## End ##########
rtt = time.time() - sendTime # 计算往返时间
print('Sequence %d: Reply from %s RTT = %.3fs' % (i+1, serverName, rtt)) # 显示信息
except Exception as e:
print('Sequence %d: Request timed out.' % (i+1))
clientSocket.close() # 关闭套接字