我没有为socket.io应用程序指定heroku的端口?

时间:2015-02-27 04:43:25

标签: javascript node.js heroku socket.io

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

我正在使用process.env.PORT变量,因为heroku将其设置为:

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

当然,我发现应用程序运行的端口号将其放在网址

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

然而,这给了我一个“net :: ERR_CONNECTION_REFUSED”。

我通过删除url之后的端口nubmer来实现它(在这个例子中:1111)。我想知道为什么这是有效的,因为大多数在线教程和文章都指定了端口以及为什么我的本地计算机需要端口才能工作。

1 个答案:

答案 0 :(得分:4)

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

这样做是为了使浏览器可以直接在默认端口上连接到您的子域,而无需了解节点服务器安装的细节,以便Heroku可以自动管理您的服务器并可能与其他客户共享硬件。您每个都在不同的端口上运行,但共享同一台计算机。这些端口完全由Heroku管理,这是他们能够将多个客户放在同一硬件上的一种方式,而无需在浏览器URL中指定自定义端口(对于大多数客户而言,这将是非首发)。 / p>

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

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