nodejs socketio 多个域(单独的 io )
nodejs socketio multiple domains( separate io )
我创建了 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 创建了第二个实例(服务器),之前创建的实例就会 "disconnected" 并停止工作。
我如何创建多个 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);
...或者您可以尝试...
NGINXhttps://www.nginx.com/blog/nginx-nodejs-websockets-socketio/
祝您实施顺利。
我创建了 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 创建了第二个实例(服务器),之前创建的实例就会 "disconnected" 并停止工作。
我如何创建多个 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);
...或者您可以尝试...
NGINXhttps://www.nginx.com/blog/nginx-nodejs-websockets-socketio/
祝您实施顺利。