我正在尝试在单个客户端和服务器之间实现可靠的 UDP 消息传递方案。
在我当前的代码中,如果他只使用接收命令,我可以将递增数字 1 发送到服务器。如果服务器尝试使用发送命令回复接收到的数据,它似乎可以来回处理 1-3 条消息,然后我进入死锁。我不明白死锁的根源来自哪里。下面是我的发送和接收实现。
客户端和服务器都以将 self.seqnumber 设置为 0 开始,并且两个套接字都设置为 1 秒后超时。客户端和服务器共享这些方法,因为它们属于客户端和服务器导入的类。
def sendCommand(self, command):
self.s.sendto((self.seqnumber).to_bytes(8, "little") + command, self.address)
try:
data, self.address = self.s.recvfrom(1200)
if int.from_bytes(data[:8], 'little') == self.seqnumber:
self.seqnumber += 1
return 0
else:
return self.sendCommand(command)
except:
return self.sendCommand(command)
def getCommand(self):
while(1):
try:
data, self.address = self.s.recvfrom(1200)
if int.from_bytes(data[:8], 'little') == self.seqnumber:
self.s.sendto(data, self.address)
self.seqnumber += 1
break
elif int.from_bytes(data[:8], 'little') < self.seqnumber:
self.s.sendto(data, self.address)
else:
continue
except:
continue
return data[8:]
在服务器上运行的代码(commInf 是定义 get 和 send 命令的类):
while (1):
command = self.commInf.getCommand()
print(command.decode())
self.commInf.sendCommand(command)
以及在客户端上运行的代码:
for i in range(100):
self.commInf.sendCommand(f"{i}".encode())
command = self.commInf.getCommand()
print(command.decode())
我希望输出允许我可靠地发送消息并使用 sendCommand(带有接收的数据)返回它们,因为从 getCommand 返回的数据不包括其序列号,而只是原始数据。