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

57hvy0tb  于 2023-08-05  发布在  Redis
关注(0)|答案(2)|浏览(225)

我需要让两个不同的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');

pw136qt2

pw136qt21#

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


通过这种方式,您可以在www.example.com示例之间交换信息socket.io,更改它们的状态,使所有示例报告使用情况等。要记住的事情-验证请求;你不想收到未经授权的用户的电话:)

pbgvytdp

pbgvytdp2#

如果有人在2023年仍在寻找答案,在SocketIO集群中,您可以使用serverSideEmit从一台服务器到另一台服务器进行通信,因为它直接与同一集群中的其他服务器进行通信:
向群集的其他Socket.IO服务器发送消息。
请注意,此功能是在v4.1.0中添加的。此外,它也值得看看v4.6.0中添加的serverSideEmitWithAck。

相关问题