Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 13 additions & 6 deletions Chapter-2/Socket-Programming-Assignment-2/UDPHeartbeatClient.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
63 changes: 50 additions & 13 deletions Chapter-2/Socket-Programming-Assignment-2/UDPHeartbeatServer.py
Original file line number Diff line number Diff line change
@@ -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)
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}")