我目前正在开发一个基于node.js的服务,该服务利用socket.io在同一台机器上生成多个node.js processen。
socket.io文档说如果使用多个进程,则需要使用node.js cluster module,例如广播不仅针对连接到当前流程的客户端,还针对每个流程的所有连接客户端。
答案 0 :(得分:3)
这是你问题的迟到答案(一年后)......我相信你现在已经知道了,但是如果有其他人只是学习这个......
1)如果要在同一台机器上的多个node.js进程之间发送消息,则需要一个适配器(socket.io-redis)。目前没有其他方法可以跨不同的应用程序实例管理多个套接字,有时无法保证客户端在使用应用程序时连接到同一个实例,因此适配器会为您管理该套接字连接信息。
2)您可以编写套接字进行通信,但是一旦适配器到位,您就可以进行通信(假设您的库可以很好地协同工作 - see my related question)。
除了发送套接字之外, socket.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-emitter库可以与适配器一起使用...我可以在多个应用程序实例之间发送/接收消息,而不是......我不确定说实话有什么好处。