3

我需要有两个不同的 socket.io 服务器相互通信。我不能使用socket.io-client,因为它不区分browser to server连接和server to server连接。所以我正在尝试使用socket.io-redis.

一个是 express-socket.io 服务器,另一个是独立的 socket.io 服务器。两者都已配置为使用socket.io-redis适配器。我没有看到从 Server2 在 Server1 收到的消息。也没有错误。

服务器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');

4

1 回答 1

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 实例之间交换信息,更改它们的状态,使所有实例报告使用情况等。要记住的事情 - 验证请求;您不想从未经授权的用户那里接到这些电话:)

于 2015-05-13T17:26:50.763 回答