如何使用socket.io-redis将消息发送到另一个socket.io服务器?

时间:2015-04-30 07:51:02

标签: node.js websocket socket.io socket.io-redis

我需要有两个不同的socket.io服务器相互通信。我无法使用true,因为它无法区分socket.io-client个连接和browser to server个连接。所以我想使用server to server

一个是express-socket.io服务器,另一个是独立的socket.io服务器。两者都已配置为使用socket.io-redis适配器。我没有看到Server2从Server2收到消息。也没有错误。

Server1:

socket.io-redis

服务器2:

var express = require('express');
var app = express();

var server = app.listen(8000,function () {
	console.log('server listening at port 8000');
});

var io = require('socket.io')(server);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

io.on('message',function (message) {
	console.log(message);
});

io.on('connection',function (socket) {
	console.log('connection');
	socket.on('message',function (message) {
		console.log(message);
	});
});

1 个答案:

答案 0 :(得分:3)

socket.io-redis不允许您从一个服务器捕获另一个服务器上的事件。它是如何工作的只是简单地推动"消息由一台服务器发送到其他连接的服务器,因此可以将这些消息发送到。

如果实例A将收到一个事件(即io.on('connect')),您将无法在实例B上捕获该事件。但是,您将能够向连接到所有实例的所有客户端发送消息,只需拨打

即可
socket.on('message', function(socket){
   socket.emit('hello', 'New message');
}

这样您就可以将消息广播到所有客户端,这些客户端连接到实例A或B(包括你自己)。此方法允许您将应用程序扩展到一台计算机上的其他实例(使用多个线程)或其他服务器。

如果你需要你的服务器来"说"彼此,您可以利用您现有的传输层 - Express服务器。您可以为不同类型的请求创建处理程序,例如:

app.get('/api/clientCount', function(req, res){
  res.send(io.engine.clientsCount);
});

这种方式您可以在socket.io实例之间交换信息,更改其状态,使所有实例报告使用情况等。要记住 - 验证请求;您不希望从未经授权的用户那里接听这些电话:)