2015-11-22 53 views
3

這實際上是一個編程設計問題,而不僅僅是特定的語言或庫問題。我正在修改一個獨立的websockets聊天服務器的想法,它將接受幾個基於瀏覽器的遠程JavaScript客戶端。我首先要做一些超級簡單的事情,然後再構建它。服務器只是保持接受客戶端連接並收聽消息。當收到一條消息時,它將被髮送回所有的客戶端。聊天服務器如何將消息分發給多個客戶端?

我需要更好地理解的是,哪種方法最適合將消息發送給所有客戶端,具體而言,即時發送給所有客戶端,或者在客戶端連接處理程序輪到時將消息排隊到每個客戶端隊列以發送向上。下面是一個蟒蛇般的僞代碼的兩個例子:

廣播法

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) 

什麼是最好的方法?或者,也許它們適合不同的使用情況,在這種情況下,它們應該使用哪些優點,缺點和環境。謝謝!

+0

我想到的最好的東西是https://en.wikipedia.org/wiki/Observer_pattern – Tempux

回答

1

首先,我覺得單個客戶端處理程序會知道所有其他現有客戶端,這似乎很奇怪。這應該是您應該抽象出來的第一件事,並創建一箇中央消息處理處理程序,而不是單個客戶端與之通話。

該處理程序可以將消息直接發送到客戶端(如在您的廣播示例中),或者將它們添加到客戶端的隊列中(如您的隊列示例)。哪個首選版本取決於你的網絡協議。

既然你說過你將使用websockets,你仍然有一個持久的網絡連接到客戶端,所以你可以立即發送它們。排隊(和緩衝)消息沒有真正的收益。理想情況下,客戶端無論如何都只需要一個方法,然後客戶端將在內部決定是否將其附加到隊列或通過網絡立即發送。

此外,由於websockets在本質上是異步的,因此無論如何您都不需要繁忙的等待循環。您可以直接監聽來自客戶端的消息,處理這些消息,並使用中央處理程序廣播消息。而且,既然你不再有等待循環,那麼你就再也無法從你的隊列中解脫出來,讓直接的廣播成爲更自然的決定。