gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:44:38 25 4
gpt4 key购买 nike

我正在制作一个 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
"""

我已经尽可能地将我的代码归结为以下内容,它仍然可以在我的计算机上运行,​​但在另一个上给出了相同的错误:
|start.py
|app
|__init__.py
|views.py
|templates
|index.html

# __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

# views.py

from app import APP
from socketio import Client
from flask import render_template

@APP.route('/', methods=['GET', 'POST'])
def index():
sio = Client()
sio.connect("http://localhost:80", transports=['websocket', 'polling']) # Error being caused here
return render_template('index.html')

# start.py

from app import APP, SOCKETIO

if __name__ == "__main__":
SOCKETIO.run(APP, debug=True, port=80, host='0.0.0.0')

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

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

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

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

最佳答案

问题是当你尝试运行 -(Flask-webapp, websocket-client)- both of them同时,only one其中将运行。

更新:

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

  • 如果您更换机器,请确保系统软件已经是最新的。
  • 检查您的系统是否位于防火墙后面,但是当您在同一台机器上运行 Flask webapp 和 websocket-client 时,则不需要此步骤。
  • 更新操作系统后尝试重新启动计算机。
  • 使用multiprocessing而不是 Threads因为他们不会在这里工作,因为著名的 Python-Global-Interpreter or GIL .根据Only one thread can be in a state of execution at any point in time.执行 GIL 的开发人员看不到 GIL 的影响
    单线程程序,但它可以是 - 性能瓶颈 - 在
    CPU 绑定(bind)和多线程代码。
  • 然后检查:How to run flask on Port:80 . For development purposes端口:5000 is mostly recommended.
  • 为了执行"Error Handling"访问flask-socketio文档,有很好的提示来处理异常。

  • 您可以按照以下方式进行:
    @socketio.on_error_default  # handles all namespaces without an explicit error handler
    def default_error_handler(e):
    pass
  • 最后,处理 socket.timeout ,您也可以使用以下代码来处理最终错误:套接字超时:
    try:
    socketio.run(app,...

    除了socket.error作为socketerror:
    print("错误: ", socketerror)
  • 使用 postman 会更好。 .对于learning and testing目的,尝试使用POSTMAN这是一个发送REST的快速简便的平台, SOAP , 和 GraphQL直接在 Postman 中请求。访问引用:getting-started-postman .

  • 这是一个示例程序:
    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()

    关于python - 使用 websocket-client 连接时出现 WinError 10057,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58456550/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com