在同一端口上运行两个套接字服务器
Posted
技术标签:
【中文标题】在同一端口上运行两个套接字服务器【英文标题】:Running two socket servers on same port 【发布时间】:2016-06-07 20:15:44 【问题描述】:我有三台服务器
-
主服务器 - 监听所有 HTTP 请求
Socket Server 1:监听 X 种类型的套接字请求
Socket Server 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)));
我在上面的代码中面临的问题是,如果我尝试运行两个套接字服务器,浏览器会抛出如下错误:
WebSocket connection to 'wss://socketServer1:8443/socket.io/?EIO=3&transport=websocket&sid=qlSXz3os5eDI8c_EAAAC' failed: Connection closed before receiving a handshake response
但是如果一次只有一个套接字服务器在运行,那么对于该套接字服务器来说一切正常,即如果我评论 app.use 之一,例如:
app.use(vhost(mainServer, mainApp));
app.use(vhost(socketServer1, socketServerApp1(server)));
// app.use(vhost(socketServer1, socketServerApp2(server)));
不能在同一个 IP:Port 组合上运行两个套接字服务器吗?
【问题讨论】:
对于像 nginx 这样的代理来说,这听起来像是一项工作,它可以将每个发往特定主机名的传入连接转发到一台服务器上的不同端口。然后,您将拥有三个侦听器,每个侦听器一个,都侦听不同的端口。除此之外,您可能必须在您自己的服务器上模拟相同的功能,方法是在所需端口上设置一个侦听器,然后将请求分发给正确的处理程序。 你有必要拥有两个不同的 websocket 服务器吗?从那段代码看来,两者似乎都在听同一个域。也许socket.io中的namespaces
可以解决你的问题。
你的建议是合并socketServer1和socketServer2?
是的,您可以合并和使用命名空间,假设您有一页/realtime
或/realtime/deals
下面的其他页面发出其他事件并且必须与网站的其余部分不同地处理。您可以在 socket.io .of('/realtime').on(<event>,<callback>)
等中进行操作,以这种方式将其与其他常见事件分开,并且您不需要为同一应用程序拥有两个不同的 ws 服务器,我不会说不能拥有它,因为显然您可以代理请求如上所述,但我认为它更简单且更易于维护。
【参考方案1】:
问题是两个套接字服务器都有单独的侦听器,这导致了错误。将套接字侦听器移动到 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)));
【讨论】:
您有整个解决方案的示例吗? 是的,我也在生产环境中实现了相同的代码。您到底在寻找什么? 主服务器中两个套接字服务器的使用情况。我有类似的挑战,我正在尝试实施您的解决方案。以上是关于在同一端口上运行两个套接字服务器的主要内容,如果未能解决你的问题,请参考以下文章
创建一个仅限本地的端口以在同一台计算机上的进程之间进行通信?
Flash 和 AIR 中的套接字编程......两个客户端,一个服务器。监听两个端口还是一个?