Это поздний ответ на Ваш вопрос (один год спустя) ... Я уверен, что вы выяснили сейчас, но если кто-то еще только учится попадается это ...
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-эмиттер библиотека может использоваться с адаптером ... Я могу принимать/отправлять сообщения через несколько экземпляров приложения без этого. .. Я не уверен, что это хорошо, если честно.
Эмитент используется для процессов узлов, не имеющих экземпляра сервера socket.io, например. для чистых рабочих – Climax