我不必为我的socket.io应用程序指定一个用于heroku的端口?

我已经成功地做了一个testing聊天的应用程序,我已经得到了一个运行在heroku上的socket.io的节点js服务器。 在本地计算机上,我必须将客户端上的localhost端口号指定给服务器设置的端口。 但是,当我在heroku上运行我的服务器代码。 删除服务器

我使用process.env.PORTvariables,因为heroku设置:

var port = process.env.PORT || 3000; http.listen(port, function(){ console.log('listening on *:' + port); }); 

当然,我发现应用程序正在运行的端口号放在url中

 var socket = io('https://xxxx.herokuapp.com:1111'); 

但是这给了我一个“net :: ERR_CONNECTION_REFUSED”。

我通过删除URL后的端口nubmer(在这个例子中:1111)得到它的工作。 我想知道为什么这是可行的,因为大多数的教程和文章在网上有指定端口,为什么我的本地计算机需要该端口也工作。

当您连接到端口443上的heroku上的https://xxxx.herokuapp.com子域时(这是在没有指定端口时用于https连接的端口),Heroku可能使用代理或路由器来路由传入连接到您的node.js服务器正在侦听的特定端口。 在Heroku基础设施中,他们知道你的服务器在运行什么实际的内部主机,以及它正在运行什么实际的端口号,这样他们可以将你的子域的默认端口请求映射到实际的端口/主机。

这样做是为了让浏览器直接连接到默认端口上的子域名,而不必知道节点服务器安装的细节,这样Heroku就可以自动pipe理你的服务器,并可能与其他客户共享硬件。 您分别在不同的端口上运行,但共享相同的机器。 这些端口完全由Herokupipe理,这是他们能够将多个客户放在同一个硬件上的一种方式,而不必在浏览器URL中指定一个自定义端口(这对于大多数客户来说是非启动的)。

因此,Heroku为您的子域托pipe了一些代理,这些子域正在侦听默认的https端口。 因此,您不必在URL中指定端口。 在内部,他们将该连接路由到实际服务器上的实际端口。

在桌面上运行时,没有这样的代理为您执行此操作,因此您必须确保客户端和服务器端口号匹配。