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

时间:2015-11-22 15:46:15

标签: python sockets design-patterns server chat

这确实是一个编程设计问题,而不是特定的语言或库问题。我正在修改一个用于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)

队列方法

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

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

1 个答案:

答案 0 :(得分:1)

首先,对我来说,单个客户端处理程序会了解所有其他现有客户端似乎很奇怪。这应该是您应该抽象出来的第一件事,并创建一个中央消息处理处理程序,而不是个别客户端与之交谈。

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

由于您说您将使用websockets,因此您仍然可以与客户端建立持久的网络连接,因此您可以立即将其发送出去。排队(和缓冲)消息没有真正的好处。理想情况下,客户端无论如何都只有send()方法,然后客户端会在内部决定是否意味着将其附加到队列或通过网络立即发送。

此外,由于websockets本质上是异步的,所以无论如何都不需要繁忙的等待循环。您可以直接从客户端侦听消息,处理这些消息,并使用中央处理程序进行广播。而且由于你再也没有等待循环了,所以你也不再有你的队列工作的地方,使得直接广播成为更自然的决定。