Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

1006 Connection closed abnormally error with python 3.7 websockets

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!

like image 725
Matthieu Gavaudan Avatar asked Jan 09 '19 01:01

Matthieu Gavaudan


People also ask

Why is my WebSocket closing?

The WebSocket is closed before the connection is established error message indicates that some client code, or other mechanism, has closed the websocket connection before the connection was fully established.

What is a code 1006?

It means that your browser cannot reach your remote code server. The main issue is about your https connection to the server.

How do you keep a WebSocket alive in Python?

In order to keep the session alive, the client could keep sending a heart-beat or a ping to the server. The retry decorator, every time there is WebSocketConnectionClosedException, reconnects to the WebSocket server in a delay of 2 seconds, keeping the session alive.


2 Answers

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

like image 69
shiona Avatar answered Sep 20 '22 12:09

shiona


So I found the solution:

When the connection closes, it breaks out of the while loop for some reason. So in order to keep the websocket running you have to surround

resp = await websocket.recv()

with try ... except and have

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

in the exception handling part.

like image 44
Matthieu Gavaudan Avatar answered Sep 20 '22 12:09

Matthieu Gavaudan