Python套接字服务器失败

Posted

技术标签:

【中文标题】Python套接字服务器失败【英文标题】:Python socket server failing 【发布时间】:2018-04-21 23:37:18 【问题描述】:

我正在尝试在 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__

我正在尝试在安装在 Raspberry Pi 3 上的 Python 3.4.2 中运行它,它今天早上可以工作。 我用谷歌搜索了AttributeError: __exit__,发现with 使用诸如__exit__ 之类的内置方法在完成运行后缩进的指令后优雅地关闭。

完全相同的代码在我的 Windows 机器(Python 3.6.2)上运行良好,并且用于在我的树莓派上运行的代码,我整天用它做的唯一一件事就是安装 x11vnc 服务器并插入很多USB 设备。 (采集卡和 arduino,没有来自不受信任来源的 USB 驱动器)。

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

【问题讨论】:

你可能在你的 rasberry pi 和 windows 上运行不同版本的 python。首先检查这个。很有可能,你的 pi 上的版本已经过时了。 我在 windows 上运行 3.6.2,在 raspi 上运行 3.4.2,我通读了 3.5 和 3.6 更改日志,他们没有声称对 with 或 socketserver 进行了任何更改。 "3.6 版更改:增加了对上下文管理器协议的支持。退出上下文管理器相当于调用 server_close()。" with foo() as bar: 语法依赖于 foo() 返回上下文管理器。所以看起来这种语法直到 Python 3.6 才被支持 【参考方案1】:

在 3.6 中将上下文管理器添加到 socketserver:https://bugs.python.org/issue26404,与 commit。

3.6以下,3.4.2中,必须手动调用server_close()

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

【讨论】:

以上是关于Python套接字服务器失败的主要内容,如果未能解决你的问题,请参考以下文章

与蓝牙 PC 服务器的蓝牙套接字连接失败“ava.io.IOException:读取失败,套接字可能关闭或超时,读取 ret:-1”

邮件发送失败。无法连接到远程服务器。套接字操作

C ++中的TCP服务器套接字打开失败

虽然没有来自客户端的连接操作,但服务器尝试接受连接并因“非套接字上的套接字操作”而失败

是啥导致我的基本客户端/服务器套接字程序中的循环在第二次尝试时失败? [关闭]

在 Docker 中安装 MySQL 失败并显示错误消息“无法通过套接字连接到本地 MySQL 服务器”