我需要有两个不同的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);
});
});
答案 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实例之间交换信息,更改其状态,使所有实例报告使用情况等。要记住 - 验证请求;您不希望从未经授权的用户那里接听这些电话:)