python 3.7 websockets 1006连接异常关闭错误

时间:2019-01-09 01:06:31

标签: python python-3.x websocket python-asyncio

我遇到了与此python websockets的github问题相同的问题: https://github.com/aaugustin/websockets/issues/367

建议的解决方案虽然对我不起作用。我收到的错误是:

websockets.exceptions.ConnectionClosed:WebSocket连接已关闭:代码= 1006([内部],连接异常关闭),没有原因

这是我的代码:

    VERSION BUILD=1005 RECORDER=CR
    URL GOTO=https://www.bing.com
    EVENT TYPE=CLICK SELECTOR="#sb_form_q" BUTTON=0
    EVENTS TYPE=KEYPRESS SELECTOR="#sb_form_q" CHARS="wasddsaw"

我一直在测试它的方法是关闭我的互联网连接,但是经过十秒钟的延迟,它仍然会返回1006错误。

我正在运行Python 3.7和Websockets 7.0。

让我知道您的想法,谢谢!

6 个答案:

答案 0 :(得分:2)

我可能迟到了一年,但我刚遇到这个问题。我的html5 websocket客户端上没有连接问题,但是.py测试客户端在一分钟后会崩溃(客户端和服务器也都引发了1006个异常)。作为测试,我开始在客户端发送的每一帧之后await connection.recv()开始。没有更多的问题。我不需要为.py测试客户端接收数据,但是如果您让它建立起来,显然会导致问题。这也可能是我的Web版本运行良好的原因,因为我正在处理.onmessage回调。

我非常确定这就是发生此错误的原因。因此,这种仅接收数据的解决方案是一种实际的解决方案,并且不会禁用ping和破坏协议的重要功能。

答案 1 :(得分:1)

所以我找到了解决方法:

当连接关闭时,由于某种原因,它会退出while循环。因此,为了使websocket保持运行,您必须将

resp = await websocket.recv()

使用try ...,除了并拥有

print('Reconnecting')
websocket = await websockets.connect(ws_url)

在异常处理部分。

答案 2 :(得分:0)

我遇到了同样的问题。 挖掘了一段时间后,我发现答案的多个版本要求重新连接,但我认为这不是一条合理的路线,所以我又挖了一些。

启用DEBUG级别的日志记录,我发现python websockets默认发送ping数据包,但未收到响应,导致连接超时。我不确定这是否符合标准,但至少javascript websockets与我的python脚本超时的服务器完全兼容。

解决方法很简单:在connect中添加另一个kw参数:

websockets.connect(uri, ping_interval=None)

相同的参数也应适用于服务器端功能serve

更多信息,https://websockets.readthedocs.io/en/stable/api.html

答案 3 :(得分:0)

我遇到了同样的问题。 shinola的解决方案工作了一段时间,但有时仍然会出错。

为解决这个问题,我将连接置于while True:循环中,并添加了两个单独的try除了块。 consumer变量是一个处理从websocket连接接收的消息的函数。

async def websocketConnect(uri, payload, consumer):
    websocket = await websockets.connect(uri, ssl=True)
    await websocket.send(json.dumps(payload))
    while True:
        if not websocket.open:
            try:
                print('Websocket is NOT connected. Reconnecting...')
                websocket = await websockets.connect(uri, ssl=True)
                await websocket.send(json.dumps(payload))
            except:
                print('Unable to reconnect, trying again.')
        try:
            async for message in websocket:
                if message is not None:
                    consumer(json.loads(message))
        except:
            print('Error receiving message from websocket.')

我使用以下方法开始连接:

def startWebsocket(uri, payload, consumer):
    asyncio.run(websocketConnect(uri, payload, consumer))

答案 4 :(得分:0)

我认为他们在这里解释了:https://websockets.readthedocs.io/en/stable/faq.html

<块引用>

表示TCP连接丢失。因此, WebSocket 连接在没有收到关闭帧的情况下被关闭,这导致 异常。

您可以捕获并处理 ConnectionClosed 以防止它被 已登录。

长期连接丢失的原因有多种:

最终用户设备往往会经常失去网络连接,并且 不可预测,因为它们可以移出无线网络覆盖范围, 拔掉有线网络,进入飞行模式,进入 睡觉等

HTTP 负载平衡器或代理未配置为长期存在 连接可能会在很短的时间后终止连接, 通常为 30 秒。

答案 5 :(得分:-1)

我通过使用 hypercorn uvicorn 表格解决了这个问题。

hypercorn app:app