我需要让两个不同的 socket.io 服务器相互通信。我无法使用 socket.io-client
,因为它不区分 browser to server
连接和 server to server
连接。所以我正在尝试使用 socket.io-redis
。
一个是 express-socket.io 服务器,另一个是独立的 socket.io 服务器。两者都已配置为使用 socket.io-redis
适配器。我没有看到 Server1 从 Server2 收到消息。也没有错误。
服务器 1:
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);
});
});
服务器 2:
var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));
io.emit('message','Hi');
最佳答案
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 实例之间交换信息,更改它们的状态,让所有实例报告使用情况等。要记住的事情 - 验证请求;您不想接到未经授权的用户的电话:)
关于node.js - 如何使用 socket.io-redis 将消息发送到另一个 socket.io 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29962027/