From 0eec40c271c700efad4c3503ca4a0378981c4a12 Mon Sep 17 00:00:00 2001 From: boombb12138 Date: Thu, 2 Jan 2025 16:41:33 +0800 Subject: [PATCH] fix: code didn't fill the request of the exercise --- .../UDPHeartbeatClient.py | 19 ++++-- .../UDPHeartbeatServer.py | 63 +++++++++++++++---- 2 files changed, 63 insertions(+), 19 deletions(-) diff --git a/Chapter-2/Socket-Programming-Assignment-2/UDPHeartbeatClient.py b/Chapter-2/Socket-Programming-Assignment-2/UDPHeartbeatClient.py index 12c032f..4ba1ab8 100644 --- a/Chapter-2/Socket-Programming-Assignment-2/UDPHeartbeatClient.py +++ b/Chapter-2/Socket-Programming-Assignment-2/UDPHeartbeatClient.py @@ -2,11 +2,18 @@ from socket import * import time serverName = '127.0.0.1' -serverPort = 12000 +serverPort = 12001 clientSocket = socket(AF_INET, SOCK_DGRAM) -while True: - time1 = time.time() - outputdata = 'Heartbeat ' + str(time1) - clientSocket.sendto(outputdata.encode(), (serverName, serverPort)) - time.sleep(10) +sequence_number = 0;# 序列号 +while True: + try: + time1 = time.time() + outputdata = f'Heartbeat {sequence_number} {time1}' + clientSocket.sendto(outputdata.encode(), (serverName, serverPort)) + sequence_number+=1 + time.sleep(10) + except KeyboardInterrupt: + print("Heartbeat Client is closed") + break +clientSocket.close() diff --git a/Chapter-2/Socket-Programming-Assignment-2/UDPHeartbeatServer.py b/Chapter-2/Socket-Programming-Assignment-2/UDPHeartbeatServer.py index 938e5cd..edfbcde 100644 --- a/Chapter-2/Socket-Programming-Assignment-2/UDPHeartbeatServer.py +++ b/Chapter-2/Socket-Programming-Assignment-2/UDPHeartbeatServer.py @@ -1,18 +1,55 @@ -#改为Python3格式 -# UDPPingerServer.py -# We will need the following module to generate randomized lost packets -import time from socket import * +import time +import threading + +def check_clients(): + """定期检查客户端状态的线程函数""" + while True: + try: + current_time = time.time() + # 检查所有客户端状态 + for client_address, last_seen in list(client_last_seen.items()): + if current_time - last_seen > 30: # 如果超过30秒没收到心跳 + print(f"客户端 {client_address} maybe已断开") + del client_last_seen[client_address] + time.sleep(1) # 每秒检查一次 + except: + break -# Create a UDP socket -# Notice the use of SOCK_DGRAM for UDP packets +# 创建服务器socket +serverPort = 12001 serverSocket = socket(AF_INET, SOCK_DGRAM) -# Assign IP address and port number to socket -serverSocket.bind(('', 12000)) +serverSocket.bind(('', serverPort)) + +client_last_seen = {} # 记录每个客户端最后一次心跳的时间 +print(f"服务器启动,监听端口 {serverPort}...") + +# 启动检查线程 +check_thread = threading.Thread(target=check_clients) +check_thread.daemon = True # 设置为守护线程,这样主程序退出时线程也会退出 +check_thread.start() while True: - message, address = serverSocket.recvfrom(1024) - message = message.decode() - message = message.split()[1] - timeDiff = time.time() - float(message) - print("receive RTT:", timeDiff) \ No newline at end of file + try: + message, address = serverSocket.recvfrom(1024) + current_time = time.time() + message = message.decode() + + # 解析消息 + _, sequence_number, send_time = message.split() + send_time = float(send_time) + + # 计算延迟时间 + delay = current_time - send_time + + # 更新客户端最后一次心跳时间 + client_last_seen[address] = current_time + + print(f"收到来自 {address} 的心跳包 #{sequence_number}, 延迟: {delay:.3f}秒") + + except KeyboardInterrupt: + print("\n服务器停止运行") + serverSocket.close() + break + except Exception as e: + print(f"发生错误: {e}") \ No newline at end of file