web-dev-qa-db-ja.com

1006接続が異常終了しましたpython 3.7 websocketsのエラー

python websockets: https://github.com/aaugustin/websockets/issues/367 でこのgithubの問題と同じ問題が発生しています

提案された解決策は私にとってもうまくいきません。私が得ているエラーは:

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

私がテストしてきた方法は、インターネット接続を閉じることですが、10秒の遅延の後も1006エラーが返されます。

私はPython 3.7およびWebsockets 7.0を実行しています。

あなたの考えを教えてください、ありがとう!

6

だから私は解決策を見つけました:

接続が閉じると、何らかの理由でwhileループから抜け出します。したがって、WebSocketを実行し続けるためには、囲む必要があります。

resp = await websocket.recv()

試して...を除いて持っている

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

例外処理部分。

2

同じ問題が発生しました。しばらく調べたところ、再接続を指示する回答のバージョンが複数見つかりましたが、それが適切なルートだとは思わなかったので、さらに掘り下げました。

デバッグレベルのログを有効にすると、python websocketsはデフォルトでpingパケットを送信し、応答を受信できないため、接続がタイムアウトします。これが標準と一致するかどうかはわかりませんが、最小javascript websocketsはサーバーで完全に問題ありませんmy pythonスクリプトはタイムアウトします。

修正は簡単です:connectに別のkw引数を追加します:

websockets.connect(uri, ping_interval=None)

同じ引数がサーバー側関数serveでも機能するはずです。

詳細は https://websockets.readthedocs.io/en/stable/api.html にあります

2
shiona