运行 同一端口上的两个套接字服务器
Running two socket servers on same port
我有三台服务器
- 主服务器 - 侦听所有 HTTP 请求
- Socket Server 1 : 监听X种socket请求
- 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)));
我有三台服务器
- 主服务器 - 侦听所有 HTTP 请求
- Socket Server 1 : 监听X种socket请求
- 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)));