使用 websocket-client 连接时出现 WinError 10057

Ahn*_*woo 5 python websocket flask python-3.x flask-socketio

我正在制作一个 Flask webapp,我正在使用 Flask-Socketio。由于各种原因,我还需要使用 websocket-client 包。一切都按预期工作,除了当我尝试在不同网络的不同计算机上运行该应用程序时,出现以下错误:

"""
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
"""
Run Code Online (Sandbox Code Playgroud)

我已经尽可能地将我的代码归结为以下代码,它仍然可以在我的计算机上运行,​​但在另一个上给出了相同的错误:

|start.py
|app
    |__init__.py
    |views.py
    |templates
        |index.html
Run Code Online (Sandbox Code Playgroud)
"""
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
"""
Run Code Online (Sandbox Code Playgroud)
|start.py
|app
    |__init__.py
    |views.py
    |templates
        |index.html
Run Code Online (Sandbox Code Playgroud)
# __init__.py

from flask import Flask
from flask_socketio import SocketIO
from gevent import monkey

monkey.patch_all()

APP = Flask(__name__)
SOCKETIO = SocketIO(APP, engineio_logger=True, logger=True)

from . import views
Run Code Online (Sandbox Code Playgroud)

index.html 只是一个基本的“Hello World”html 页面。

什么样的东西可能会在一台计算机/网络上而不是另一台计算机/网络上给我这个错误,特别是只是运行它localhost:80?我真的不知道在这里尝试什么。

编辑:将回溯数据添加到错误

编辑 2:在我的实际代码中, websocket.Client 正在 Celery 任务中运行。我没有在这里包含它,因为该错误是可重现的,而无需考虑太多的复杂性。

Muh*_*man 0

问题是,当您尝试同时运行(Flask-webappwebsocket-client) 时both of themonly one它们中的一个将会运行。

\n\n
\n\n

更新:

\n\n

以下是一些需要注意的事项:

\n\n
    \n
  • 如果您更换机器,请确保系统软件已经是最新的。
  • \n
  • 检查您的系统是否位于防火墙后面,但是当您在同一台计算机上运行 Flask webapp 和 websocket-client 时,则不需要此步骤。
  • \n
  • 更新操作系统后尝试重新启动计算机。
  • \n
  • 使用multiprocessing而不是Threads因为它们在这里不起作用,因为著名的Python-Global-Interpreter 或 GIL。根据该报告,Only one thread can be in a state of execution at any point in time.GIL 的影响对于执行单线程程序的开发人员来说是不可见的,但它可能是 CPU密集型和多线程代码中的性能瓶颈。
  • \n
  • 然后检查:如何在端口:80 上运行烧瓶For development purposes 端口:5000 is mostly recommended.

  • \n
  • 为了执行"Error Handling"访问flask-socketio文档,有一些很好的提示来处理异常。

  • \n
\n\n

您可以按如下方式进行:

\n\n
@socketio.on_error_default  # handles all namespaces without an explicit error handler\ndef default_error_handler(e):\n    pass\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 最后,为了处理socket.timeout,您还可以使用以下代码来处理最终错误:套接字超时:

    \n\n
    try:\nsocketio.run(app,...\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    except socket.error as socketerror:\n print("错误: ", socketerror)

  • \n
  • 这将是一种更好的使用方法postmanlearning and testing出于目的,尝试使用这是一个快速且简单的平台,可以直接在 Postman 中POSTMAN发送RESTSOAP发送和请求。GraphQL访问参考:Getting-started-postman

  • \n
\n\n

这是一个示例程序:

\n\n
import multiprocessing\n\n# Assume for flask-app\ndef start_flask_app:\n    app.run()\n\n# Assume for websocket-client-app\n# Assume basic events you will handle in your client e.g. on_message, on_error, on_close\ndef start_ws:\n    ws = websocket.WebSocketApp(WS_URI, on_message= on_message,\n                                        on_error = on_error, \n                                        on_close = on_close)\n    ws.on_open = on_open\n    ws.run_forever()\n\n# use of sub-processes instead of threads.\np_flask = multiprocessing.Process(target=start_flask_app)\np_ws = multiprocessing.Process(target=start_ws)\n\np_ws.start()\np_flask.start()\n\np_ws.join()\np_flask.join()\n
Run Code Online (Sandbox Code Playgroud)\n