聊天服务器如何将消息分发给多个客户端?

2024-04-24 06:24:22 发布

您现在位置:Python中文网/ 问答频道 /正文

这实际上是一个编程设计问题,而不是一个特定的语言或库问题。我正在为websockets设计一个独立的聊天服务器,它可以接受多个基于浏览器的远程javascript客户端。一开始我要做一些非常简单的事情,然后可能会建立起来。服务器只是继续接受客户机连接并监听消息。当收到一条消息时,它将被发送回所有的客户端。在

我需要更好地理解的是,哪种方法最适合于将消息发送给所有客户机,具体地说,是立即向所有客户机发送消息,还是将消息排队到每个客户机的队列中,以便在出现客户机连接处理程序时发送消息。下面是类python伪代码中的两个示例:

广播方法

def client_handler(client):
    while true:
        if(client.pending_msg):
            rmsg = client.recv()
            for c in clients:
                c.send(rmsg)
        client.sleep(1)

队列方法

^{pr2}$

最好的方法是什么?或者,也许它们适用于不同的用例,在这种情况下,它们应该被使用的优点、缺点和环境是什么。谢谢!在


Tags: 方法服务器client语言消息客户端客户机远程
1条回答
网友
1楼 · 发布于 2024-04-24 06:24:22

首先,我觉得奇怪的是,一个客户机处理程序会知道所有其他现有客户机。这应该是您首先应该抽象出来并创建一个中央消息处理处理程序,而不是单个客户机与之对话。在

然后,该处理程序可以直接将消息发送到客户机(如广播示例中所示),也可以将其添加到客户机的队列中(如您的队列示例)。哪个版本是首选版本取决于您的网络协议。在

既然您说过您将使用websockets,那么无论如何您都有一个到客户端的持久网络连接,所以您可以立即将它们发送出去。对消息进行排队(和缓冲)并没有真正的好处。理想情况下,客户机无论如何都会有一个send()方法,然后客户机将在内部决定是将其附加到队列中还是立即通过网络发送它。在

此外,由于websockets本质上是异步的,所以您不需要繁忙的等待循环。您可以直接监听来自客户机的消息,处理这些消息,然后使用中央处理程序进行广播。既然你再也没有等待循环了,也就没有地方可以让你从队列中解脱出来,让即时广播成为更自然的决定。在

相关问题 更多 >