gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:35:43 29 4
gpt4 key购买 nike

我正在尝试在同一个 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()

最佳答案

这是一种在一台服务器上同时处理 websockets 和 http 请求的方法。与您提议的唯一区别是两个处理程序都在同一端口上监听。

我认为可以通过定义两个 aiohttp 应用程序来监听不同的端口。但是,您无论如何都需要一个支持异步的 HTTP 服务器。 AFAIK HTTPServernot asyncio-enabled,所以你提出的解决方案无法工作,因为你正在混合基于 asyncio 的服务器 (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()

关于 python 3; Websockets 服务器和 HTTP 服务器 - run_forever 和 serve_forever,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53689602/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com