node.js - nodejs socketio 多个域(单独的io)

标签 node.js express socket.io vhosts express-vhost

我创建了 2 个使用 socketio+nodejs 的网站(+ 2 个开发站点)。 现在,我需要将 2 个站点移至一台服务器中。

为此,我使用了express-vhost,它适用于所有内容......除了socket.io。

在我的应用程序中,我已经使用了数百次以下功能。 socket.emit()、io.sockets.emit()、socket.broadcast.emit() 等等。 当我创建网站时,我第一次使用 socketio,并且正在学习它。因此,我从未使用过命名空间(仍然没有使用过它们)。

现在,当我在 vhost 下运行两个站点时,有人连接到 site1,他们也会连接到 site2,因为他们使用相同的 socket.io 实例。

因此,我尝试创建多个 socketio 实例,每个域一个,如下所示

http = server.listen(80);//my vhost main app

global.io_for_domain_1 = require('socket.io')(http, {'transports': ['websocket', 'polling']} );

global.io_for_domain_2 = require('socket.io')(http, {'transports': ['websocket', 'polling']} );

/*And then, in my domain app, i was hoping to simply swap out the reference for io like so
...in my global socket controller that passes io reference to all other controllers...*/
this.io = global.io_for_domain_1 ;
//hoping that this would help me to avoid not having to re-write the hundreds of references that use io.

这似乎可行......但是,一旦我为 socketio 创建第二个实例(服务器),之前创建的实例就会“断开连接”并停止工作。

我如何创建socketio服务器的多个实例并让它们独立工作。或者,我还能如何解决这个问题...也许使用命名空间(我仍然不知道如何使用它们)。

最佳答案

这很难回答,这取决于你的服务器代码, 但这可能会帮助您找到解决方案...

[1] 唯一的 socket.io 实例(使用命名空间):

您必须找到实现它的最佳方法......

var domain_a = io.of('/domain_a');
var domain_b = io.of('/domain_b');

domain_a.on('domainA_clientAction', function(socket){
    domain_a.emit('domainA_clientAction');
});

domain_b.on('domainB_clientAction', function(socket){
    domain_b.emit('domainB_serverResponse');
});

编辑:此选项适用于您希望来自domain_a 和domain_b 的客户端在它们之间进行通信的情况

[2]独立的node.js服务:

在端口 80 上使用带有 node-http-proxy 的 Node.js 作为其他 Node.js 服务的路由器。

var http = require('http')
, httpProxy = require('http-proxy');

httpProxy.createServer({
  hostnameOnly: true,
  router: {
    'domain-a.com': '127.0.0.1:3001',
    'domain-b.com': '127.0.0.1:3002'
  }
}).listen(80);

...或者也许你可以尝试...
NGINX https://www.nginx.com/blog/nginx-nodejs-websockets-socketio/

祝您实现顺利。

关于node.js - nodejs socketio 多个域(单独的io),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35190846/

相关文章:

javascript - 从 NodeJS 到 Node/Express 的安全 POST 请求挂起

node.js - 参数化 Jest 的期望

mysql - Sequelize/mysql 在创建或更新数据时使用 100% CPU

node.js - 如何在 Node Express 应用程序中干燥需求?

Node.js 错误 : Cannot find module express

javascript - io.emit 不发送 promise 返回

node.js - Laravel Forge - Node.js Websocket 超时

typescript - 带有 typescript 客户端的 Socket.io

javascript - console.log 中显示错误的类名

node.js - 如何在postgres中更新和插入数据