2015-08-15 73 views
0

我目前正在使用基於node.js的socket.io服務,該服務利用node.js cluster module在同一臺機器上產生多個node.js進程。有關socket.io適配器的問題

的socket.io文檔說,它需要使用一個adapter如果使用了多個過程,以便例如廣播目標不僅是連接到當前流程的客戶,而且還針對每個流程的所有關聯客戶。

  1. 我是否正確理解,即使所有進程都是本地產生的(即不跨越多個服務器),我仍需要使用此類適配器?
  2. 服務器進程需要從時間進行通信,以時間(只是單向的,即,廣播的消息,而不需要一個響應)。如果這樣的適配器在使用中(例如socket.io-redis),I可以用它來廣播到所有服務器進程中呢?還是適配器僅用於定位連接的客戶端?

回答

2

這是一個遲到的回答你的問題(一年後)......我敢肯定,你現在想通了,但如果其他人只是學習遇到這...

1 )怎麼做,如果你想在多個node.js的進程發送同一臺機器上的郵件需要一個適配器(socket.io-Redis的)。目前還沒有其他的方式來管理在不同的應用程序實例的多個插座,有時不能保證客戶端連接到同一個實例,而使用的應用程序,以便該適配器爲您管理該套接字連接信息。

2)您可以編寫套接字來進行通信,但是一旦適配器就位,您就可以進行通信(假設您的庫一起工作良好 - see my related question)。

io.broadcast.emit將傳達給所有插座除了發送插座

io.sockets.emit將傳達給所有插座

socket.emit將溝通只是插座

例子:

服務器

var redisPort = 6379 
var io = require('socket.io'); 
var redisAdapter = require('socket.io-redis'); 

io = io.listen(httpServer); //the server instance (supply your own code here) 

io.adapter(redisAdapter({ host: 'localhost' , port : redisPort }));//6379 
io.on('connection', function(socket){ 

    socket.on('client-msg', function(data){ 
     var msgObject = { content : '' , status : 0 }; 
     if(data && data.content){ 
      msgObject.content = data.content; 
      msgObject.status = 1; 
     } 

     io.emit('server-response', msgObject);//send to all sockets 
     socket.emit('server-response', msgObject);//send to this socket 
     socket.broadcast.emit('server-response', msgObject); //send to all other sockets but not this one 

    }); 

    socket.on('disconnect', function(data) { 
     //do some stuff unrelated to emitting       
    }); 
}); 

客戶

var socketio = io.connect(window.location.origin , { transports : ['websocket'] }); 

socketio.emit("send-message" , { content : msg }); 

socketio.on("server-response", function(data) { 
    console.log(data.content , data.status); 
}); 

注*的(疏)socket.io docs也提到一個socket.io發射體庫可以與適配器一起使用......我能發送/接收跨多個應用實例的消息沒有如此。 ..我不確定什麼是誠實的。

+0

發射器用於沒有實例化的socket.io服務器,前點的過程。爲純粹的工作者 – Climax