【问题标题】:Create websocket over ssl and https server in python在 python 中通过 ssl 和 https 服务器创建 websocket
【发布时间】:2021-11-28 19:15:28
【问题描述】:

我已经在 python 中使用内置库(如WebSocketServerFactory)实现了 webSocket 服务器,如下代码所示:

from autobahn.asyncio.websocket import WebSocketServerProtocol, WebSocketServerFactory
import ssl

import asyncio


sslcontext = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
sslcontext.load_cert_chain(self.sslcert, self.sslkey)

factory = WebSocketServerFactory(u"{0}://127.0.0.1:{1}".format(ws, self.port))
factory.protocol = ResourceProtocol

loop = asyncio.get_event_loop()

coro = loop.create_server(factory, '', self.port, ssl=sslcontext)
self.server = loop.run_until_complete(coro)

我想知道是否可以添加另一个带有 event_loop 的服务器,它将运行简单的 http 服务器来接受 GET/POST 请求?

【问题讨论】:

  • 有什么理由不使用像 Flask 或 FastAPI 这样的通用 Web 框架?
  • 您好,感谢您的评论。或许你能给我参考一个在其中一个框架中实现的 websocket 和 http 服务器的例子吗?
  • 在这里试试:fastapi.tiangolo.com/advanced/websockets 我使用 FastAPI 已经有一段时间了,取得了很大的成功。
  • 它确实似乎更容易实现......但我看不到如何将 ssl 层添加到我的 websocket 和 http 处理程序。也许你有一些添加它的经验?
  • 您使用uvicorn 启动应用程序。只需传递适当的标志。 uvicorn.org/settings/#https

标签: python websocket https server autobahn


【解决方案1】:

理论上应该是可以的。

你可以使用

asyncio.gather() allows to wait on several tasks at once.

例如使用aiohttp http server 运行 websocket 服务器(高速公路)

# websocket server autobahn
coro = loop.create_server(factory, '', self.port, ssl=sslcontext)

# http server using aiohttp
runner = aiohttp.web.AppRunner(app)
loop.run_until_complete(runner.setup())
site = aiohttp.web.TCPSite(runner)        

server = loop.run_until_complete(asyncio.gather(coro, site.start()))
loop.run_forever()

或者您可以使用 loop.run_until_complete() 函数两次以完成这两个函数。

注意:我没有测试过这段代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    相关资源
    最近更新 更多