Python 3;Сервер веб-сокетов и HTTP-сервер - run_forever & serve_forever - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь запустить сервер websockets и http-сервер в одном приложении python.Похоже, я пытаюсь запустить два цикла навсегда, а второй цикл не активируется.Любой совет, как я могу запустить оба этих сервера?

httpd = HTTPServer(('localhost', 8000), SimpleHTTPRequestHandler)

httpd.serve_forever()
asyncio.get_event_loop().run_until_complete(
    websockets.serve(echo, 'localhost', 8001))
asyncio.get_event_loop().run_forever()

1 Ответ

0 голосов
/ 27 февраля 2019

Вот один из способов обслуживать как веб-сокеты, так и http-запросы на одном сервере.Единственная разница с тем, что вы предложили, заключается в том, что оба обработчика прослушивают один и тот же порт.

Я считаю, что можно прослушивать отдельные порты, определив два приложения aiohttp.Тем не менее, в любом случае вам понадобится HTTP-сервер с поддержкой asyncio.AFAIK HTTPServer имеет , а не с поддержкой асинхронности, поэтому предлагаемое решение не может работать, поскольку вы смешиваете асинхронный сервер (websockets.serve) с неасинхронным (HTTPServer).

#!/usr/bin/python3.7

import aiohttp
from aiohttp import web, WSCloseCode
import asyncio


async def http_handler(request):
    return web.Response(text='Hello, world')


async def websocket_handler(request):
    ws = web.WebSocketResponse()
    await ws.prepare(request)

    async for msg in ws:
        if msg.type == aiohttp.WSMsgType.TEXT:
            if msg.data == 'close':
                await ws.close()
            else:
                await ws.send_str('some websocket message payload')
        elif msg.type == aiohttp.WSMsgType.ERROR:
            print('ws connection closed with exception %s' % ws.exception())

    return ws


def create_runner():
    app = web.Application()
    app.add_routes([
        web.get('/',   http_handler),
        web.get('/ws', websocket_handler),
    ])
    return web.AppRunner(app)


async def start_server(host="127.0.0.1", port=1337):
    runner = create_runner()
    await runner.setup()
    site = web.TCPSite(runner, host, port)
    await site.start()


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(start_server())
    loop.run_forever()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...