Как сохранить соединение с клиентом async websockets? - PullRequest
0 голосов
/ 07 ноября 2018

Я изменил пример для websocket клиента, которого я нашел здесь , например:

import asyncio
import websockets
async def hello(messages):
    async with websockets.connect('ws://localhost:8765') as websocket:
        for m in ('msg1', 'msg2'):
            await websocket.send(m)
            print(f"> {m}")
            greeting = await websocket.recv()
            print(f"< {greeting}")
asyncio.get_event_loop().run_until_complete(hello(['name1', 'name2']))

Но теперь я получаю исключение, как только второй send() будет выполнен:

Traceback (most recent call last):
  File "ws-client.py", line 44, in <module>
    main()
  File "ws-client.py", line 41, in main
    asyncio.get_event_loop().run_until_complete(hello(['name1', 'name2']))
  File "/usr/lib64/python3.6/asyncio/base_events.py", line 468, in run_until_complete
    return future.result()
  File "ws-client.py", line 35, in hello
    greeting = await websocket.recv()
  File "/home/frans/.local/lib/python3.6/site-packages/websockets/protocol.py", line 350, in recv
    yield from self.ensure_open()
  File "/home/frans/.local/lib/python3.6/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 = 1000 (OK), no reason

Я не настолько увлечен asyncio - может кто-нибудь сказать мне, что я делаю не так?

Я также взял код сервера из примера ..

1 Ответ

0 голосов
/ 07 ноября 2018

Вы изменили клиента, но не изменили сервер, поэтому проблема на стороне сервера. Просто проверьте его код.

import asyncio
import websockets

async def hello(websocket, path):
    name = await websocket.recv()
    print(f"< {name}")

    greeting = f"Hello {name}!"

    await websocket.send(greeting)
    print(f"> {greeting}")

start_server = websockets.serve(hello, 'localhost', 8765)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

После принятия нового соединения он ожидает первого сообщения от клиента, затем отправляет его обратно и выходит из обработчика. По сути, он просто закрывает соединение. Таким образом, когда ваш клиент пытается отправить второе сообщение, происходит сбой с ошибкой Connection closed.

Вы можете изменить сервер таким образом, чтобы повторить полезную нагрузку дважды.

  async def hello(websocket, path):
      for _ in range(2):  # or while True if you need an infinite echo server
          name = await websocket.recv()
          print(f"< {name}")

          greeting = f"Hello {name}!"

          await websocket.send(greeting)
          print(f"> {greeting}")
...