Python 3;Websockets服务器&;HTTP服务器-永远运行&;永远为你服务
我试图在同一个python应用程序中运行websockets服务器和http服务器。看起来我试图运行两个永久循环,而第二个循环没有被激活。关于如何让这两台服务器都运行,有什么建议吗Python 3;Websockets服务器&;HTTP服务器-永远运行&;永远为你服务,python,http,websocket,server,Python,Http,Websocket,Server,我试图在同一个python应用程序中运行websockets服务器和http服务器。看起来我试图运行两个永久循环,而第二个循环没有被激活。关于如何让这两台服务器都运行,有什么建议吗 httpd = HTTPServer(('localhost', 8000), SimpleHTTPRequestHandler) httpd.serve_forever() asyncio.get_event_loop().run_until_complete( websockets.serve(echo
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()
这里有一种通过一台服务器同时为WebSocket和http请求提供服务的方法。与您建议的唯一区别是两个处理程序都在同一个端口上侦听 我认为可以通过定义两个
aiohttp
应用程序来侦听不同的端口。但是,在任何情况下,您都需要一个支持异步IO的HTTP服务器。AFAIKHTTPServer
未启用异步,因此您提出的解决方案无法工作,因为您将基于异步的服务器(websockets.service
)与非异步服务器(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()