Почему этот простой код веб-сокета генерируется, когда клиент отключается? - PullRequest
0 голосов
/ 07 октября 2018

Я пишу простой код веб-сокета на основе этих документов .Ожидается, что сервер будет прослушивать веб-сокеты и просто отвечать на ping сообщения с помощью pong.

Я работаю на Python3, и код сервера выглядит следующим образом:

import asyncio
import websockets
from jsonrpcserver.aio import methods
from jsonrpcserver.response import NotificationResponse

@methods.add
async def ping():
    return 'pong'

async def accept_connection(websocket, path):
    async for request in websocket:
        response = await methods.dispatch(request)
        if not response.is_notification:
            await websocket.send(str(response))

start_server = websockets.serve(accept_connection, 'localhost', 5000)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

Клиент находится в Dart и просто вызывает ping дважды, а затем закрывает соединение.Выходные данные сервера получают эту ошибку, когда клиент отключается:

Dannys-MacBook:pythonws danny$ python3 server.py 
--> {"jsonrpc":"2.0","method":"ping","id":0}
<-- {"jsonrpc": "2.0", "result": "pong", "id": 0}
--> {"jsonrpc":"2.0","method":"ping","id":1}
<-- {"jsonrpc": "2.0", "result": "pong", "id": 1}
Error in connection handler
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/websockets/server.py", line 152, in handler
    yield from self.ws_handler(self, path)
  File "server.py", line 11, in accept_connection
    async for request in websocket:
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/websockets/py36/protocol.py", line 15, in __aiter__
    yield await self.recv()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/websockets/protocol.py", line 350, in recv
    yield from self.ensure_open()
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/websockets/protocol.py", line 512, in ensure_open
    self.close_code, self.close_reason) from self.transfer_data_exc
websockets.exceptions.ConnectionClosed: WebSocket connection is closed: code = 1005 (no status code [internal]), no reason

Согласно документам, указанным выше:

Итерация прекращается, когда клиент отключается.

Это наводит меня на мысль, что нужно просто выйти из цикла async for и не бросать?

1 Ответ

0 голосов
/ 09 октября 2018

https://www.pydoc.io/pypi/websockets-6.0/autoapi/protocol/index.html

Итератор выдает входящие сообщения.Он обычно выходит, когда соединение закрыто с кодом состояния 1000 (ОК) или 1001 (уход).Возникает исключение ConnectionClosed, когда соединение закрывается с любым другим кодом состояния.

Закрытие со статусом 1000 от клиента предотвращает исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...