web-dev-qa-db-fra.com

1006 Connexion fermée anormalement une erreur avec python 3.7 Websockets

J'ai le même problème que ce problème GITHUB avec python WebSockets: https://github.com/aaugustin/websockets/issues/367

La solution proposée ne fonctionne pas pour moi cependant. L'erreur que je reçois est:

webSockets.Exception.ConnectionClosed: La connexion WebSocket est fermée: Code = 1006 (connexion fermée anormalement [interne]), aucune raison

Ceci est mon 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())

La façon dont j'ai testés, c'est en fermant ma connexion Internet, mais après un délai de dix secondes, il renvoie toujours l'erreur 1006.

Je suis en cours d'exécution Python 3.7 et WebSockets 7.0.

Faites-moi savoir ce que sont vos pensées, merci!

11
Matthieu Gavaudan

J'ai donc trouvé la solution:

Lorsque la connexion se ferme, il sort de la boucle tandis que la boucle pendant une certaine raison. Donc, afin de garder les sites Web sur lesquels vous devez entourer

resp = await websocket.recv()

avec essayer ... sauf et ont

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

dans la partie de traitement des exceptions.

2
Matthieu Gavaudan

J'ai couru dans ce même problème. La solution par Shinola a travaillé pendant un certain temps, mais j'aurais toujours des erreurs parfois.

Pour gérer cela, je mets la connexion dans un while True: boucle et ajouté deux essais séparés à l'exception des blocs. La variable consumer est une fonction qui traite les messages reçus de la connexion 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.')

Je commence la connexion en utilisant:

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