原文档:
https://m653uatd6t.feishu.cn/docs/doccnBhfhSQ8wZ3krkTnQ3GbDHf#KJ735Z
参考文章:
https://zhuanlan.zhihu.com/p/387279376
服务器端代码:
import random
from socket import *
# 使用 AF_INET 套接字家族,SOCK_DGRAM 代表面向非连接(UDP)
serverSocket = socket(AF_INET, SOCK_DGRAM)
# 将 socket 绑定在本机 IP 的 10000 端口
serverSocket.bind(('127.0.0.1', 10000))
while True:
# 生成一个 [1, 10] 的随机数,包含两端
rand = random.randint(1, 10)
# 将收到的 packet 中的数据存入 message,将地址存入 address(客户端地址)
message, address = serverSocket.recvfrom(1024)
# 下面是对收到的 message 进行处理
# 将 bytes 类型的 message 转换为 string 类型
message_str = message.decode('utf-8')
# 在 30% 的概率下丢弃收到的 packet
if rand < 4:
continue
# 对收到的 message 做简单处理
ret = '{' + message_str + '}'
# 做出响应(将处理后的数据通过sendto函数送回客户端),注意还要将 string 编码为 bytes 类型
serverSocket.sendto(ret.encode(), address)
客户端代码
from socket import *
import time
# SOCK_DGRAM 表示使用UDP协议
client = socket(AF_INET, SOCK_DGRAM)
# 设置超时时间为1秒
client.settimeout(1)
# 服务端的ip和端口
server_address = ('152.136.19.235', 10000)
for i in range(10):
# 发送ping命令
client.sendto(b"2020212487", server_address)
send_time = time.time()
try:
message, adr = client.recvfrom(1024)
recv_time = time.time() # 获取
print(f"[{i}]\t{message.decode()}\tRTT: {(recv_time - send_time) * 1000:.2f}ms")
except timeout as e: # 超时就打印LOST
print(f"[{i}]\tLOST")