2016-04-17 60 views
4

我非常渴望將Socket.io集成到我的node.js項目中,但我對如何正確使用socket.io有一些疑惑。我一直在瀏覽文檔和教程,但是我一直無法理解關於socket.io如何工作的一些概念。Socket.io:如何處理/管理多個客戶端請求和響應?

我心目中的情形是這樣的:

  • 有多個客戶端C1,C2,...,CN
  • 客戶端發出請求到服務器R1,... RN
  • 服務器接收請求,確實數據處理
  • 當數據處理完成時,服務器發出響應於客戶端器Rs1,......,Rs2的

與c onfusion我在這的情況是,當服務器完成數據處理它發出下列方式響應:

// server listens for request from client 
socket.on('request_from_client', function(data){ 
    // user data and request_type is stored in the data variable 
    var user = data.user.id 
    var action = data.action 

    // server does data processing 
    do_some_action(..., function(rData){ 
     // when the processing is completed, the response data is emitted as a response_event 
     // The problem is here, how to make sure that the response data goes to the right client 
     socket.emit('response_to_client', rData) 
    }) 
}) 

但在這裏我沒有定義,我發送到響應的客戶端!

  • socket.io如何處理這個問題?
  • socket.io如何確保:響應Rs1被髮送到C1?
  • 什麼是確保:響應Rs1不發送到C2?

我希望我已經很好地解釋了我的疑惑。

回答

3

socket對象的實例對應於客戶端連接。因此,從該實例發出的每條消息都會發送到打開該套接字連接的客戶端。請記住,在connection事件中,您將獲得(通過onDone回調)套接字連接對象。每次客戶端連接到socket.io服務器時,都會觸發此事件。

如果你想將消息發送到所有客戶端,您可以使用
io.sockets.emit("message-to-all-clients")

,如果你想將事件發送到每一個客戶除了發射事件 socket.broadcast.emit("message-to-all-other-clients");

+0

哦之一!我終於明白了!謝謝。這是我頭腦中的混亂,我認爲套接字對象是客戶端可以連接的「全局通道」。但現在有意義的是,在每個連接上都會創建一個「新頻道」。 –