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

3
我需要让两个不同的socket.io服务器相互通信。我不能使用socket.io-client,因为它不能区分浏览器到服务器连接和服务器到服务器连接。因此,我尝试使用socket.io-redis
一个是express-socket.io服务器,另一个是独立的socket.io服务器。两者都已配置为使用socket.io-redis适配器。我在Server1上没有看到来自Server2的消息。并且没有出现错误。

Server1 :

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);
 });
});

服务器二:

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

io.emit('message','Hi');


你检查过 Redis 存储器中事件是否被正确写入了吗? - cdagli
@cdagli 可以看一下 https://dev59.com/-Zbfa4cB1Zd3GeqPuHru 这个链接吗?我从你的用户描述中看到你有一些 socket.io 的经验 :). 下面的 Koval 说得对吗,我不能使用 socket.io-redis 实现服务器之间的通信吗? - adaniluk
2个回答

3

socket.io-redis 无法从一个服务器上捕获另一个服务器的事件。它的工作方式是将一个服务器发射的消息“推送”到其他连接的服务器,以便它们可以发射这些消息。

如果实例 A 收到一个事件(例如 io.on('connect')),则您无法在实例 B 上捕获该事件。但是,您可以通过调用 io.emit() 向所有实例上连接的客户端发射消息。

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实例之间交换信息,更改它们的状态,使所有实例报告使用情况等。需要记住的是-对请求进行身份验证;您不希望未经授权的用户发出这些调用:)


0
如果在2023年仍然有人在寻找答案,在SocketIO集群中,您可以使用serverSideEmit从一个服务器直接与同一集群中的其他服务器进行通信:

向集群中的其他Socket.IO服务器发送消息。

请注意,此功能是在v4.1.0中添加的。另外,还值得一看的是在v4.6.0中添加的serverSideEmitWithAck

“it is worthy” 在英语中的意思是什么? - tchrist
我只是想说一句“还有这个要看看”。 - Benzamin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接