Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用websocket客户端连接时出现WinError 10057_Python_Python 3.x_Flask_Websocket_Flask Socketio - Fatal编程技术网

Python 使用websocket客户端连接时出现WinError 10057

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

我正在制作一个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.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.timeout
      ,您还可以使用以下代码来处理最终错误:socket超时:

      try:
      socketio.run(app,...
      
      除了socket.error作为socketerror之外: 打印(“错误:”,socketerror)

    • 使用
      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应用程序的主线程中。如果我对完整代码进行相同的更改,则错误不会更改。