【发布时间】:2023-02-10 06:56:46
【问题描述】:
我有一个 UDP 套接字服务器程序,用于演示 UDP 的工作原理(服务器和客户端的代码如下)。我在服务器上运行它,然后让 client.py 程序发送消息并接收回复。不幸的是,我遇到了一个似乎只发生在校园 Wifi 上的问题。在校园wifi上,客户端收不到响应。
使用 Wireshark 进行故障排除显示了问题。由于某种原因,UDP 服务器正在响应两条 UDP 消息 - 一条为空,一条包含响应消息。这些消息在 Wireshark 中记录为大约间隔 0.000002 秒。在有线网络上,有响应的始终排在第一位,而在 Wifi 上,空消息始终排在第一位。由于客户端正在等待单个消息响应,因此当空消息返回时,客户端打印并退出,并且永远不会看到实际的响应。
我知道我可以编写客户端来监听这两条消息并打印出有数据的消息,但我宁愿尝试弄清楚发生了什么。为什么 socketserver 首先响应两条消息,我怎样才能让它只发送一条消息?或者至少先发送数据。
server.py:
import socketserver
class MyUDPRequestHandler(socketserver.DatagramRequestHandler):
def handle(self):
data = self.request[0].strip()
socket = self.request[1]
# just send back the same data, but lower-cased
socket.sendto(data.lower(), self.client_address)
if __name__ == "__main__":
with socketserver.UDPServer(("0.0.0.0", 9091), MyUDPRequestHandler) as server:
server.serve_forever()
client.py:
import socket
HOST, PORT = "localhost", 9091
message = "NOW I AM SHOUTING" # The UDP server will lowercase the message
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(bytes(message + "\n", "utf-8"), (HOST, PORT))
received = str(sock.recv(1024), "utf-8")
print("Sent: {}".format(message))
print("Received: {}".format(received))
【问题讨论】:
-
如果您暂时从
handle(self)方法中删除.strip()和.lower()调用,神秘行为是否会继续发生? -
因此,无论哪种方式,您都会收到两个,但顺序有时会在无线上发生变化?
-
顺序似乎每次都在无线上改变,是的,无论哪种方式,我都会收到两条响应消息。
-
@JeremyFriesner 条带是必需的,删除
lower()不会改变任何东西。 -
@Ryan 调试所需的条带如何?
标签: python sockets udp socketserver