我正在尝试连接到heroku上的socket.io服务器。我在端口8080上使用简单的快速服务器为我的Backbone客户端提供服务。当我尝试这样做时:
$sbt clean compile
[success] Total time: 0 s, completed Dec 23, 2016 5:39:28 PM
[info] Updating {file:/home/tzachz/dev/sbt_testing/}sbt_testing...
[info] Done updating.
[info] Compiling 25 Scala sources to /home/tzachz/dev/sbt_testing/target/scala-2.11/classes...
[success] Total time: 24 s, completed Dec 23, 2016 5:39:52 PM
$find . -name "*.properties"
zsh: no matches found: *.properties
$sbt run
// ...
$find . -name "*.properties"
./target/scala-2.11/resource_managed/main/demo/myapp.properties
./target/scala-2.11/classes/demo/myapp.properties
我明白了:
获取https://test16793.herokuapp.com:8080/socket.io/?EIO=2&transport=polling&t=1482505848382-0 net :: ERR_CONNECTION_REFUSED
然而,当我只打开我的index.html文件时,它设法连接到heroku没有问题。似乎端口号被添加到heroku链接的末尾,然后在使用express提供服务时尝试连接。
有谁知道我能做些什么呢?
答案 0 :(得分:0)
尝试将var port = process.env.PORT || 8080;
用于您的应用端口,而不是8080
。
当你在端口443上连接到heroku上的https://xxxx.herokuapp.com子域时(这是在没有指定端口时用于https连接的端口),Heroku可能正在使用代理或路由器来路由该传入连接到node.js服务器正在侦听的特定端口。在Heroku基础结构中,他们知道运行服务器的实际内部主机以及运行的实际端口号,以便他们可以将子域上的默认端口请求映射到实际的端口/主机。
这样做是为了使浏览器可以直接在默认端口上连接到您的子域,而无需了解节点服务器安装的细节,以便Heroku可以自动管理您的服务器并可能与其他客户共享硬件。您每个都在不同的端口上运行,但共享同一台计算机。这些端口完全由Heroku管理,这是他们能够将多个客户放在同一硬件上的一种方式,而无需在浏览器URL中指定自定义端口(对于大多数客户而言,这将是非首发)。 / p>
因此,Heroku正在为您的子域托管某种代理,该子域正在侦听默认的https端口。因此,您不必在URL中指定端口。在内部,他们将该连接路由到您实际服务器上的实际端口。
在桌面上运行时,没有这样的代理为您执行此操作,因此您必须确保客户端和服务器端口号匹配。