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

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

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

相关文章:

node.js - Nodejs 循环中的 promise

javascript - Socket.io:如何检查是否有一定数量的客户端发出了事件?

javascript - Firebase .orderByChild().equalTo().once().then() 当 child 不存在时 promise

javascript - 如何仅呈现更新后的统计数据 - websockets

javascript - React Native初始化错误: Couldn't find package "error-ex" on the "npm" registry

websocket - Protovis 强制重新渲染

terminal - 无法将终端附加到 docker 中正在运行的容器

node.js - socket.io xhr-轮询断开事件

javascript - Socket.IO 延迟发送

javascript - 单击按钮后文本区域输入未设置为空字符串,文本区域光标未从头开始