Node.js 在同一端口上运行两个套接字服务器

Node.js 在同一端口上运行两个套接字服务器,node.js,express,socket.io,vhosts,Node.js,Express,Socket.io,Vhosts,我有三台服务器 主服务器-侦听所有HTTP请求的服务器 套接字服务器1:侦听X种类型的套接字请求 套接字服务器2:侦听Y类型的套接字请求 我想使用相同的IP:Port组合运行所有三台服务器,并且所有三台服务器都有不同的主机名。我已更新了本地DNS,即/etc/hosts以将所有三个域名解析为同一IP,例如127.0.0.1 我正在使用VHost根据主机名解析请求,并将请求定向到相应的服务器。以下是代码: var express = require('express'); var vhost =

我有三台服务器

  • 主服务器-侦听所有HTTP请求的服务器
  • 套接字服务器1:侦听X种类型的套接字请求
  • 套接字服务器2:侦听Y类型的套接字请求
  • 我想使用相同的IP:Port组合运行所有三台服务器,并且所有三台服务器都有不同的主机名。我已更新了本地DNS,即
    /etc/hosts
    以将所有三个域名解析为同一IP,例如
    127.0.0.1

    我正在使用
    VHost
    根据主机名解析请求,并将请求定向到相应的服务器。以下是代码:

    var express = require('express');
    var vhost = require('vhost');
    var app = express();
    var https = require('https');
    
    
    var mainServer =  <hostname1> ;
    var socketServer1 = <hostname2> ;
    var socketServer2 = <hostname3>;
    
    
    var server = https.createServer(<options>, app);
    
    server.listen(<somePort>,function(){
        console.log('VHost running');
    });
    
    var mainApp = require('./app.js');
    var socketServerApp1 = require('./socketServer1');
    var socketServerApp2 = require('./socketServer2');
    
    app.use(vhost(mainServer, mainApp));
    app.use(vhost(socketServer1, socketServerApp1(server)));
    app.use(vhost(socketServer2, socketServerApp2(server)));
    
    但如果一次只运行一个套接字服务器,则该套接字服务器的工作正常,即,如果我对app.use中的一个进行注释,如:

    app.use(vhost(mainServer, mainApp));
    app.use(vhost(socketServer1, socketServerApp1(server)));
    //  app.use(vhost(socketServer1, socketServerApp2(server)));
    

    无法在同一IP:端口组合上运行两个套接字服务器吗?

    问题是两个套接字服务器都有单独的列表器,这导致了错误。将socket listner移动到vhost应用程序可以解决此问题。代码如下:

    var express = require('express');
    var vhost = require('vhost');
    var app = express();
    var https = require('https');
    var socketio = require('socket.io');
    
    
    var mainServer =  <hostname1> ;
    var socketServer1 = <hostname2> ;
    var socketServer2 = <hostname3>;
    
    
    var server = https.createServer(<options>, app);
    var io = socketio.listen(server);
    
    server.listen(<somePort>,function(){
        console.log('VHost running');
    });
    
    var mainApp = require('./app.js');
    var socketServerApp1 = require('./socketServer1');
    var socketServerApp2 = require('./socketServer2');
    
    app.use(vhost(mainServer, mainApp));
    app.use(vhost(socketServer1, socketServerApp1(io)));
    app.use(vhost(socketServer2, socketServerApp2(io)));
    
    var express=require('express');
    var vhost=要求(“vhost”);
    var-app=express();
    var https=require('https');
    var socketio=require('socket.io');
    var mainServer=;
    var socketServer1=;
    var socketServer2=;
    var server=https.createServer(,app);
    var io=socketio.listen(服务器);
    server.listen(,function(){
    console.log('VHost running');
    });
    var mainApp=require('./app.js');
    var socketServerApp1=require('./socketServer1');
    var socketServerApp2=require('./socketServer2');
    应用程序使用(vhost(mainServer,mainApp));
    应用程序使用(vhost(socketServer1,socketServerApp1(io));
    应用程序使用(vhost(socketServer2,socketServerApp2(io));
    
    听起来像是nginx这样的代理的工作,它可以将每个特定主机名的传入连接转发到一台服务器上的不同端口。然后,您将有三个侦听器,每个侦听器一个,都在不同的端口上侦听。除此之外,您可能需要在自己的服务器上模拟相同的功能,方法是在所需的端口上安装一个侦听器,然后将请求分发到正确的处理程序。是否需要安装两个不同的websocket服务器?从这段代码来看,似乎两者都在听同一个域。也许socket.io中的
    名称空间可以解决您的问题。您的建议是合并socketServer1和socketServer2?是的,您可以合并并使用名称空间,假设您有一个页面
    /realtime
    或下面的其他页面
    /realtime/deals
    ,这些页面会发出其他事件,必须以与网站其他部分不同的方式进行处理。你可以在socket.io
    .of(“/realtime”).on(,)
    等等中进行操作,以这种方式将它与其他常见事件分开,并且你不需要为同一个应用程序使用两个不同的ws-Server,我不会说不能使用它,因为显然你可以代理上面提到的请求,但在我看来,它更简单、更易于维护。您有完整解决方案的示例吗?是的,我也在生产环境中实现了相同的代码。您到底在寻找什么?主服务器中两个套接字服务器的使用情况。我有一个类似的挑战,我正在尝试实施您的解决方案。
    var express = require('express');
    var vhost = require('vhost');
    var app = express();
    var https = require('https');
    var socketio = require('socket.io');
    
    
    var mainServer =  <hostname1> ;
    var socketServer1 = <hostname2> ;
    var socketServer2 = <hostname3>;
    
    
    var server = https.createServer(<options>, app);
    var io = socketio.listen(server);
    
    server.listen(<somePort>,function(){
        console.log('VHost running');
    });
    
    var mainApp = require('./app.js');
    var socketServerApp1 = require('./socketServer1');
    var socketServerApp2 = require('./socketServer2');
    
    app.use(vhost(mainServer, mainApp));
    app.use(vhost(socketServer1, socketServerApp1(io)));
    app.use(vhost(socketServer2, socketServerApp2(io)));