运行 同一端口上的两个套接字服务器

Running two socket servers on same port

我有三台服务器

  1. 主服务器 - 侦听所有 HTTP 请求
  2. Socket Server 1 : 监听X种socket请求
  3. Socket Server 2 : 监听Y种socket请求

我想 运行 所有三台服务器使用相同的 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)));

我在上面的代码中面临的问题是,如果我尝试 运行 两个套接字服务器,浏览器会抛出类似这样的错误:

WebSocket connection to 'wss://socketServer1:8443/socket.io/?EIO=3&transport=websocket&sid=qlSXz3os5eDI8c_EAAAC' failed: Connection closed before receiving a handshake response

但是如果一次只有一个套接字服务器 运行ning,那么该套接字服务器就可以正常工作,即如果我评论 app.use 之一,例如:

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

是否不可能 运行 两个套接字服务器在同一个 IP:Port 组合上?

问题是两个套接字服务器都有单独的侦听器,这是导致错误的原因。将套接字侦听器移动到 vhost App 可以解决问题。以下是代码:

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)));