当前位置: 首页 > 知识库问答 >
问题:

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

单喜
2023-03-14

我正在制作一个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
# __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')

索引。html只是一个基本的“Hello World”html页面。

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

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

编辑2:在我的实际代码中,webSocket。客户端正在西芹任务中运行。我没有在这里包含它,因为错误是可以复制的,而不需要那么复杂。

共有1个答案

韶浩皛
2023-03-14

问题是,当您尝试同时运行-(Flask webapp、websocket client)这两个客户端时,其中只有一个将运行。

更新:

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

>

  • 如果您更换机器,请确保系统软件已经是最新的。
  • 检查您的系统是否在防火墙后面,但是当您在同一台机器上运行Flask webapp和webSocock-Client时,则不需要执行此步骤。
  • 更新操作系统后尝试重新启动您的机器。
  • 使用多重处理而不是线程,因为它们在这里不起作用,因为著名的Python-Global-解释器或GIL。根据这一理论,在任何时间点只有一个线程可以处于执行状态。GIL的影响对执行单线程程序的开发人员来说是不可见的,但在CPU绑定和多线程程序中,它可能是一个性能瓶颈线程代码
  • 然后检查:如何在端口: 80上运行烧瓶。对于开发目的端口: 5000是最推荐的。

    为了执行错误处理,请访问flasketio留档,有很好的提示来处理异常。

    你可以去如下:

    @socketio.on_error_default  # handles all namespaces without an explicit error handler
    def default_error_handler(e):
        pass
    

    >

    try:
    socketio.run(app,...
    

    除了socket.error:打印(错误:,打印)

    使用邮递员将是一种更好的方法。出于学习和测试的目的,请尝试使用POSTMAN,这是一个快速简便的平台,可直接在POSTMAN内发送RESTSOAPGraphQL请求。访问参考:快速入门邮递员。

    下面是一个示例程序:

    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()
    

  •  类似资料:
    • 我对javax有问题。websocket(使用Eclipse IDE和Jetty 9服务器)。我写了ClientEndDoint(带有所有注释)。这段代码可以与“ws://”配合使用,但我在尝试使用“wss://”时遇到了问题。 我试图做它与SSLContext,但不知道如何我可以添加SSLContextFactory到我的会话或套接字容器。 或者我如何可以使所有连接可信? StackTrace:

    • 我正在java应用程序中使用Jetty 9.4.18库编写WebSocket客户端。 我对WebSockets非常陌生,所以我开始使用Jetty文档中的两个示例类进行测试,连接到echo。websocket。组织机构 当我在没有SSL的情况下连接时,测试运行正常,但是如果连接到时失败 我总是遇到同样的异常: 看起来服务器在没有响应握手请求的情况下关闭。 我知道SslContextFactory,但

    • 问题内容: 我在ElastiCache上运行Redis集群。 多个进程连接到Redis集群。每个进程都位于Docker容器中。流程不尽相同-我有一个流程,一个流程等。 正常运行几天后,连接到Redis时,我的某些进程开始超时。当我进入受影响的容器并尝试通过到达群集时,与群集的连接超时。这告诉我,问题不仅影响过程,而且影响整个容器。 当我从任何其他容器中使用时,连接都不会出现问题。 我的进程会根据需

    • 我正在尝试使用hazelcast v3。2.4(服务器和客户端上的版本相同)。服务器(我可以安装的简单实现)正在服务器上运行。客户端尝试连接到远程服务器-服务器打印身份验证请求,但我收到以下日志输出(包括异常)-关于我可以做什么不同的想法(复制日志输出和配置文件)。我正在尝试通过TCP/IP进行连接,我检查了网络连接——我没有看到任何东西阻止连接。 堆栈中提到的代码行: 配置 日志输出 服务器输出

    • 我试图使用Python Twisted Authobhan websocket客户端打开客户端(每台机器有60K端口限制)的并发websocket连接。但是我无法使用下面的代码打开不超过20K的连接: 我在一个循环中使用了“reactor.connecttcp”,使用Twisted打开并发websocket连接是否正确? 让我知道。

    • 问题内容: 我正在尝试使用基本上通过以下方式构建的Java客户端使用SSL消耗IBM MQ(版本8.0.0.8): Oracle JKD 8和IBM JRE 7(出于测试目的,我每个都有一个客户端) com.ibm.mq.allclient-9.1.0.0.jar javax.jms-api-2.0.1.jarspring-jms-4.3.7.RELEASE.jar spring-jms-4.3.