首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3;Websockets & HTTP run_forever & serve_forever

Python3;Websockets & HTTP run_forever & serve_forever
EN

Stack Overflow用户
提问于 2018-12-09 05:12:31
回答 1查看 3.5K关注 0票数 4

我试图在同一个python应用程序中运行websockets服务器和http服务器。看起来我想永远运行两个循环,而第二个循环却没有被激活。关于如何让这两台服务器运行,有什么建议吗?

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2019-02-27 15:12:34

这里有一种方法可以在一台服务器上同时服务websockets和http请求。与您建议的唯一不同之处在于,两个处理程序在同一个端口上侦听。

我认为可以通过定义两个aiohttp应用程序来侦听不同的端口。但是,在任何情况下,您都需要一个支持异步的HTTP服务器。AFAIK HTTPServer而不是异步启用的,因此您提出的解决方案无法工作,因为您正在将基于异步的服务器(websockets.serve)与非异步服务器(HTTPServer)混合使用。

代码语言:javascript
复制
#!/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()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53689602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档