Python 套接字服务器失败

Python socket server failing

我正在尝试在 python 3.

中启动 UDP 服务器

我从 this example.

复制了代码

这是我的确切代码。

import socketserver

class MyUDPHandler(socketserver.BaseRequestHandler):
    """
    This class works similar to the TCP handler class, except that
    self.request consists of a pair of data and client socket, and since
    there is no connection the client address must be given explicitly
    when sending data back via sendto().
    """

    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        print("{} wrote:".format(self.client_address[0]))
        print(data)

if __name__ == "__main__":
    HOST, PORT = "localhost", 19446
    with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
        server.serve_forever()

我只是去掉了handle方法的回复,改了端口号。

当我尝试 运行 时,我得到了这个

$ sudo python3 test.py
  File "test.py", line 19, in <module>
    with socketserver.UDPServer((HOST, PORT), MyUDPHandler) as server:
AttributeError: __exit__

我正在尝试 运行 在 Python 3.4.2 上安装这个 Raspberry Pi 3,它今天早上工作。 我用谷歌搜索 AttributeError: __exit__,发现 with 使用 __exit__ 等内置方法在完成 运行 后缩进的指令后正常关闭。

完全相同的代码 运行 在我的 windows 机器上(Python 3.6.2)和 运行 在我的 [=38= 上使用的代码完全相同] 而我一整天用它做的唯一一件事就是安装 x11vnc 服务器并插入许多 USB 设备。 (采集卡和 arduino,没有来自不受信任来源的 USB 驱动器)。

所以我的问题是,什么会导致 socketserver 库中出现 Attribute Error: __exit__

上下文管理器已添加到 3.6 中的 socketserverhttps://bugs.python.org/issue26404, with commit

3.6以下,3.4.2中,需要手动调用server_close()

try:
    server = socketserver.UDPServer((HOST, PORT), MyUDPHandler)
    server.serve_forever()
finally:
    server.server_close()