Python – 1006 Connection closed abnormally error with python 3.7 websockets

pythonpython-3.xpython-asynciowebsocket

I'm having the same problem as this github issue with python websockets:
https://github.com/aaugustin/websockets/issues/367

The proposed solution isn't working for me though. The error I'm getting is:

websockets.exceptions.ConnectionClosed: WebSocket connection is closed: code = 1006 (connection closed abnormally [internal]), no reason

This is my code:

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

The way I've been testing it is by closing my internet connection, but after a ten second delay it still returns the 1006 error.

I'm running Python 3.7 and Websockets 7.0.

Let me know what your thoughts are, thanks!

Best Answer

I encountered the same problem. After digging a while I found multiple versions of the answer that tells to just reconnect, but I didn't think it was a reasonable route, so I dug some more.

Enabling DEBUG level logging I found out that python websockets default to sending ping packets, and failing to receive a response, timeouts the connection. I am not sure if this lines up with the standard, but at least javascript websockets are completely fine with the server my python script times out with.

The fix is simple: add another kw argument to connect:

websockets.connect(uri, ping_interval=None)

The same argument should also work for server side function serve.

More info at https://websockets.readthedocs.io/en/stable/api.html