【问题标题】:Data exchange between websocket clients and serverwebsocket客户端和服务器之间的数据交换
【发布时间】:2022-01-21 18:04:48
【问题描述】:

我有一个系统,它有一个 fastAPI 服务器、一个在 Raspberry 上实现的 python 客户端和用于用户界面的 Javascript 客户端。数据从 python 客户端发送到服务器,然后转发到 Js 客户端,反之亦然。我在服务器和每种类型的客户端之间建立了连接,但是当从客户端发送到服务器时,它只是发送回那个客户端,其余的什么都没有收到。处理这个问题的正确方法是什么?希望得到您的帮助。谢谢。

【问题讨论】:

  • 请添加负责与您的客户端建立连接的服务器代码
  • 您是说您希望服务器将每个输入广播给所有客户端吗?你可以这样做,但这不是 TCP 服务器正常运行的方式。如果这是您想要的,请说出来,我们可以提出一些建议。
  • 是的,但不完全是。我想将消息从客户端广播到所有剩余的客户端。我已经使用 NodeJS 上的 socketIO 库完成了该操作,但在 fastAPI 服务器中,我找不到如何操作。
  • @kosciej16 J 刚刚在 FastAPI 文档上举了一个 WebSocket 的例子。首先,我想做一个基本任务,比如接收和发送短信,但它没有按预期工作。只是发送客户端收到消息,而不是所有客户端。
  • 我添加了一个答案,但我知道它非常复杂,需要您进行一些研究。如果您遇到问题,请告诉我,我们会尝试添加更多提示。

标签: python websocket server fastapi


【解决方案1】:

websocket 的问题是它不支持广播。 您可以在某处存储已连接客户端的列表并遍历它们以发送消息

CLIENTS = set()
async def broadcast():
    while True:
        await asyncio.gather(
            *[ws.send("woof") for ws in CLIENTS],
            return_exceptions=False,
        )
        await asyncio.sleep(2)

asyncio.create_task(broadcast())

async def handler(websocket, path):
    CLIENTS.add(websocket)
    try:
        async for msg in websocket:
            pass
    finally:
        CLIENTS.remove(websocket)

start_server = websockets.serve(handler, ...)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

您可以阅读更多信息here

但是我的建议是使用socket.io。有了它,您可以创建rooms 并将数据发送给所有通过单次发射进入房间的客户端。

【讨论】:

  • 感谢您的帮助。我不太擅长python,所以在你的推荐中,我发现python socket-io 可以完全满足需要。我对其进行了一些研究,但仍然无法将其集成到 fastAPI 服务器。你能给我一个如何做到这一点的例子吗?这将不胜感激。谢谢
  • 晚上会准备的 ;)
  • @ThanhNhon 这是 sn-p,让我知道它是否适合你,还有什么我可以澄清的更多stackoverflow.com/questions/70429135/…
  • 非常感谢您的帮助。只需简单的代码行,它就可以顺利运行。请注意也搜索此内容的人的版本:我在 Javascript 客户端上使用 python-socket io v5.5.0 和 socket.IO v4。为了从 python-socketio 客户端发出事件,您可能还需要安装“python-socketio[client]”
猜你喜欢
  • 2018-09-14
  • 2017-09-07
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-21
相关资源
最近更新 更多