Python 使用websocket客户端连接时出现WinError 10057
我正在制作一个Flask网络应用程序,我正在使用Flask Socketio。出于各种原因,我还需要使用websocket客户端包。一切正常,但当我尝试在不同网络上的不同计算机上运行应用程序时,出现以下错误:Python 使用websocket客户端连接时出现WinError 10057,python,python-3.x,flask,websocket,flask-socketio,Python,Python 3.x,Flask,Websocket,Flask Socketio,我正在制作一个Flask网络应用程序,我正在使用Flask Socketio。出于各种原因,我还需要使用websocket客户端包。一切正常,但当我尝试在不同网络上的不同计算机上运行应用程序时,出现以下错误: """ Traceback (most recent call last): File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 2449, in wsgi_app response = self.ha
"""
Traceback (most recent call last):
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 2449, in wsgi_app
response = self.handle_exception(e)
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1866, in handle_exception
reraise(exc_type, exc_value, tb)
File "[Path to venv]\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "[Path to venv]\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
raise value
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "[Path to app]\app\views.py", line 7, in index
sio.connect("http://localhost:80/", transports=['websocket', 'polling'])
File "[Path to venv]\venv\lib\site-packages\socketio\client.py", line 262, in connect
engineio_path=socketio_path)
File "[Path to venv]\venv\lib\site-packages\engineio\client.py", line 170, in connect
url, headers, engineio_path)
File "[Path to venv]\venv\lib\site-packages\engineio\client.py", line 346, in _connect_websocket
cookie=cookies)
File "[Path to venv]\venv\lib\site-packages\websocket\_core.py", line 514, in create_connection
websock.connect(url, **options)
File "[Path to venv]\venv\lib\site-packages\websocket\_core.py", line 223, in connect
options.pop('socket', None))
File "[Path to venv]\venv\lib\site-packages\websocket\_http.py", line 120, in connect
sock = _open_socket(addrinfo_list, options.sockopt, options.timeout)
File "[Path to venv]\venv\lib\site-packages\websocket\_http.py", line 189, in _open_socket
raise error
File "[Path to venv]\venv\lib\site-packages\websocket\_http.py", line 172, in _open_socket
sock.connect(address)
OSError: [WinError 10057] A request to send or receive data was disallowed because
the socket is not connected and (when sending on a datagram socket using a sendto call)
no address was supplied
"""
我已将我的代码尽可能简化为以下代码,这些代码在我的计算机上仍然有效,但在另一台计算机上出现相同的错误:
|start.py
|app
|__init__.py
|views.py
|templates
|index.html
初始化
从烧瓶进口烧瓶
从flask_socketio导入socketio
从gevent导入猴子
猴子
APP=烧瓶(名称)
SOCKETIO=SOCKETIO(应用程序,引擎日志=True,日志=True)
从…起导入视图
#views.py
从应用程序导入应用程序
从socketio导入客户端
从flask导入渲染模板
@APP.route('/',方法=['GET','POST'])
def index():
sio=客户机()
连接(”http://localhost:80“,transports=['websocket','polling'])#此处导致错误
返回渲染模板('index.html')
#start.py
从应用程序导入应用程序,SOCKETIO
如果名称=“\uuuuu main\uuuuuuuu”:
run(APP,debug=True,port=80,host='0.0.0.0')
index.html
只是一个基本的“Hello World”html页面
什么样的东西会在一台计算机/网络而不是另一台计算机/网络上给我这个错误,特别是在localhost:80
上运行它?我真的不知道该在这里尝试什么
编辑:将回溯数据添加到错误
编辑2:在我的实际代码中,websocket.Client正在芹菜任务中运行。我没有把它包括在这里,因为错误是可以复制的,没有那么复杂。问题是当你试图同时运行-(Flask webapp,websocket client)
这两个时,只有一个会运行
更新:
以下是一些需要注意的事项:
- 如果要更换机器,请确保系统软件已经是最新的
- 检查您的系统是否不在防火墙后面,但当您在同一台计算机上运行Flask webapp和websocket client时,则不需要执行此步骤
- 尝试在更新操作系统后重新启动计算机
- 使用
多处理
而不是线程
,因为它们在这里不起作用,因为。根据它,在任何时间点,只有一个线程可以处于执行状态。
执行GIL的开发人员看不到GIL的影响
单线程程序,但它可能是中的一个性能瓶颈
CPU绑定和多线程代码李>
然后检查:<代码>用于开发目的
端口:5000<代码>是最推荐的。
“错误处理”
请访问文档,这里有一些处理异常的好技巧@socketio.on_error_default # handles all namespaces without an explicit error handler
def default_error_handler(e):
pass
- 最后,要处理
,您还可以使用以下代码来处理最终错误:socket超时:socket.timeout
除了socket.error作为socketerror之外: 打印(“错误:”,socketerror)try: socketio.run(app,...
- 使用
是一种更好的方法。出于postman
学习和测试的目的,请尝试使用
,它是一个快速简便的平台,用于直接在postman内发送postman
、REST
和SOAP
请求。访问参考:GraphQL
import multiprocessing
# Assume for flask-app
def start_flask_app:
app.run()
# Assume for websocket-client-app
# Assume basic events you will handle in your client e.g. on_message, on_error, on_close
def start_ws:
ws = websocket.WebSocketApp(WS_URI, on_message= on_message,
on_error = on_error,
on_close = on_close)
ws.on_open = on_open
ws.run_forever()
# use of sub-processes instead of threads.
p_flask = multiprocessing.Process(target=start_flask_app)
p_ws = multiprocessing.Process(target=start_ws)
p_ws.start()
p_flask.start()
p_ws.join()
p_flask.join()
请添加错误的堆栈跟踪。这将提供您在问题描述中遗漏的上下文。@Miguel谢谢。我编辑了我的问题。奇怪。如果使用1024以上的端口号,是否会遇到相同的问题?我想知道这是否与您使用非管理员帐户有关,在该帐户下您将无法在端口80上运行任何内容。@Miguel可能。我明天试试看。计算机ot确实可以工作,但我也没有管理员权限,但值得一试。@Miguel使用端口5000和8080时也会遇到同样的问题。我认为您在帐户权限方面的做法是正确的。也可能是防火墙问题?我也在远程连接一台不能工作的电脑,但我不认为这会成为一个问题。谢谢你的回答,穆罕默德。我觉得这不是我想要的。我没有运行
websocket.WebSocketApp
,只运行websocket.Client
和Flask-SocketIO
。我遇到的问题是,我的应用程序在一台计算机上按预期工作,但在另一台计算机上却不能。我将探索您链接的一些资源,但我不确定这是否是我要寻找的。哦,对了,我还应该在我的实际代码中提到websocket。客户端正在运行芹菜任务。我意识到我的示例代码不是使用websocket.Client的正确方法,但它是重现我的问题的最低代码量。@Ahndwoo您访问过以下任一链接:1-
2-
[我已经查看了第一个链接。问题似乎不一样。解决方案是用IP地址代替“localhost”,但这没有起任何作用。第二个链接断开了。我还刚刚发现,如果我删除传输
kwarg,我会得到一个连接被服务器拒绝的错误。啊,无需担心,这可能是因为客户端位于SocketIO应用程序的主线程中。如果我对完整代码进行相同的更改,则错误不会更改。