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