запуск нескольких веб-сокетов - PullRequest
0 голосов
/ 04 января 2019

Вот фрагмент кода, который у меня есть

import asyncio
import websockets

async def get_cells(websocket, path):
    async for message in websocket:
        ... some code

async def get_shaded_area(websocket, path):
    async for message in websocket:
        ... #some code


asyncio.get_event_loop().run_until_complete(
    websockets.serve(get_cells, 'localhost', 8765))

asyncio.get_event_loop().run_until_complete(
    websockets.serve(get_shaded_area, 'localhost/shade-area', 8765))

asyncio.get_event_loop().run_forever()

, он начался только с get_cells, поэтому у него был только один get_event_loop для get_cells, в тот момент он работал нормально.

Поскольку я хочу создать более одного соединения ws, так как каждый обрабатывает разные данные и возвращает разные результаты, второй get_shaded_area после добавления выдает эту ошибку:

(pixelart) sam@sam-Lenovo-G51-35:~/code/pixelart$ python path.py
Traceback (most recent call last):
File "path.py", line 144, in <module>
    websockets.serve(get_shaded_area, 'localhost/shade-area', 8765))
File "/usr/lib/python3.6/asyncio/base_events.py", line 473, in run_until_complete
    return future.result()
File "/usr/lib/python3.6/asyncio/tasks.py", line 537, in _wrap_awaitable
    return (yield from awaitable.__await__())
File "/home/sam/code/envs/pixelart/lib/python3.6/site-packages/websockets/py35/server.py", line 13, in __await_impl__
    server = await self._creating_server
File "/usr/lib/python3.6/asyncio/base_events.py", line 1019, in create_server
    infos = yield from tasks.gather(*fs, loop=self)
File "/usr/lib/python3.6/asyncio/base_events.py", line 968, in _create_server_getaddrinfo
    flags=flags, loop=self)
File "/usr/lib/python3.6/concurrent/futures/thread.py", line 56, in run
    result = self.fn(*self.args, **self.kwargs)
File "/usr/lib/python3.6/socket.py", line 745, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Я отправил вопрос в репозиторий github для этого пакета и получил простое решение.

async def get_cells(websocket):
    async for message in websocket:
        ...

async def get_shaded_area(websocket):
    async for message in websocket:
        ...

async def router(websocket, path):
    if path == "/":
        await get_cells(websocket, path)
    elif path == "/shade-area":
        await get_shaded_area(websocket, path)

asyncio.get_event_loop().run_until_complete(
    websockets.serve(router, 'localhost', 8765))

asyncio.get_event_loop().run_forever()
0 голосов
/ 04 января 2019

Вы не можете запустить несколько серверов на одной и той же паре host:port, вместо этого вы должны обработать пройденный путь - путь является конечной точкой, клиент r запрашивает во время соединения WS.

Правильный шаблон - создать «маршрутизатор», который бы выполнял эту работу за вас. Пример код (простой код, чтобы показать, что я имею в виду):

import asyncio
import websockets


async def get_shaded_area(message):
  print('shade-area:' + message)


async def get_cells(messzage):
  print('Cells area:' + messzage)


async def router(websocket, path):
  async for message in websocket:
    if path == "/shade-area":
      await get_shaded_area(message)
    else:
      await get_cells(message)


def main():
  asyncio.get_event_loop().run_until_complete(websockets.serve(router, '127.0.0.1', 8765))
  asyncio.get_event_loop().run_forever()


if __name__ == '__main__':
  main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...