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

Mat*_*dan 5 python websocket python-3.x python-asyncio

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

提议的解决方案对我不起作用。我得到的错误是:

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

这是我的代码:

async def get_order_book(symbol):
    with open('test.csv', 'a+') as csvfile:
        csvw = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
        DT = Data(data=data, last_OB_id=ob_id, last_TR_id=tr_id, sz=10, csvw=csvw)

        while True:
            if not websocket.open:
                print('Reconnecting')
                websocket = await websockets.connect(ws_url)
            else:
                resp = await websocket.recv()
                update = ujson.loads(resp)
                DT.update_data(update)

async def get_order_books():
    r = requests.get(url='https://api.binance.com/api/v1/ticker/24hr')
    await asyncio.gather(*[get_order_book(data['symbol']) for data in r.json()])

if __name__ == '__main__':
    asyncio.run(get_order_books())
Run Code Online (Sandbox Code Playgroud)

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

我正在运行Python 3.7和Websockets 7.0。

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

小智 25

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

启用调试级别日志记录我发现 python websockets 默认发送 ping 数据包,并且无法接收响应,连接超时。我不确定这是否符合标准,但至少 javascript websockets 对我的 python 脚本超时的服务器完全没问题。

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

websockets.connect(uri, ping_interval=None)
Run Code Online (Sandbox Code Playgroud)

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

更多信息请访问https://websockets.readthedocs.io/en/stable/api.html


Mat*_*dan 2

所以我找到了解决方案:

当连接关闭时,由于某种原因它会脱离 while 循环。因此,为了保持 websocket 运行,你必须包围

resp = await websocket.recv()
Run Code Online (Sandbox Code Playgroud)

尝试...除了并且有

print('Reconnecting')
websocket = await websockets.connect(ws_url)
Run Code Online (Sandbox Code Playgroud)

在异常处理部分。

  • 这是有史以来最糟糕的解决方案 (19认同)