带失败重发功能的UDP客户端与服务端实现问题咨询
UDP客户端自动重传实现方案
服务端代码无需修改
原有服务端逻辑已经满足要求:每次收到客户端请求时都会重新生成随机数,仅当随机数≥4时返回响应,可直接使用原有代码。
修改后的客户端代码
核心改动是为每个序号的Ping请求新增重试循环,触发超时异常时自动重发当前请求,直到成功收到服务端响应为止:
from time import * from socket import * localhost = '127.0.0.1' for i in range(1, 11): clientSocket = socket(AF_INET, SOCK_DGRAM) clientSocket.settimeout(0.5) request_success = False # 循环重试直到当前请求收到响应 while not request_success: date_current = ctime() start_time = time() try: request_msg = bytes(f"Ping {i} {date_current}", 'utf8') clientSocket.sendto(request_msg, (localhost, 12000)) resp_msg, server_addr = clientSocket.recvfrom(1024) rtt = time() - start_time print(resp_msg.decode()) print(f"Ответ {localhost} подтверждено: {rtt:.6f}") print() request_success = True except timeout: print(request_msg.decode()) print("Время вышло,正在重发请求...") print() clientSocket.close()
逻辑说明
- 客户端每发起一个序号的Ping请求,会进入专属重试循环,只有收到服务端返回的成功响应才会退出循环,处理下一个序号的请求
- 每次重试时都会重新生成请求时间戳、重置计时,保证RTT计算结果准确
- 服务端每次收到重发的请求都会生成全新的随机数,直到随机数≥4时返回响应,完成本次请求交互
内容的提问来源于stack exchange,提问作者GOGA GOGA
相关产品推荐
相关产品推荐

