2015-08-15 8 views
0

В настоящее время я работаю над сервисом socket.io, который использует node.js cluster module, чтобы вызвать несколько node.js-процессов на одном компьютере.Вопросы о socket.io-адаптерах

В документе socket.io docs указано, что требуется использовать adapter, если используются несколько процессов, так что, например, трансляция целей не только клиентов, подключенных к текущему процессу, но и всех подключенных клиентов каждого процесса.

  1. Я правильно понял, что я должен использовать такой адаптер, даже если все процессы порождаются локально (то есть не на нескольких серверах)?
  2. Процессы сервера должны время от времени связываться (просто однонаправленное, то есть широковещательное сообщение без необходимости ответа). Если такой адаптер используется (например, socket.io-redis), могу ли я использовать его для трансляции на все серверные процессы? Или адаптеры используются только для целевых подключенных клиентов?

ответ

2

Это поздний ответ на Ваш вопрос (один год спустя) ... Я уверен, что вы выяснили сейчас, но если кто-то еще только учится попадается это ...

1) Вам требуется адаптер (socket.io-redis), если вы хотите отправлять сообщения по нескольким процессам node.js на том же компьютере. В настоящее время нет другого способа управлять несколькими сокетами в разных экземплярах приложений, и иногда нет гарантии, что клиент подключается к одному экземпляру при использовании приложения, поэтому адаптер управляет этой информацией о соединении сокетов для вас.

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       
    }); 
}); 

Client

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); 
}); 

Note * (редкий) socket.io docs также упомянуть socket.io-эмиттер библиотека может использоваться с адаптером ... Я могу принимать/отправлять сообщения через несколько экземпляров приложения без этого. .. Я не уверен, что это хорошо, если честно.

+0

Эмитент используется для процессов узлов, не имеющих экземпляра сервера socket.io, например. для чистых рабочих – Climax