Python 3; Websockets服务器和HTTP服务器 - run_forever和serve_forever

7

我正在尝试在同一个Python应用程序中运行Websockets服务器和HTTP服务器。看起来我正在尝试运行两个无限循环,但第二个循环没有被激活。您有什么建议可以让这两个服务器都运行起来吗?

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()
2个回答

9
这里有一种同时为WebSockets和HTTP请求提供服务的方法。与您提出的不同之处在于两个处理程序都监听同一个端口。
我认为可以通过定义两个应用程序来监听不同的端口。然而,你无论如何都需要一个支持asyncio的HTTP服务器。据我所知,不支持asyncio,因此你提出的解决方案行不通,因为你在混合使用一个基于asyncio的服务器()和一个非异步的服务器()。
#!/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()

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接