8

我有一个用 node.js 编码的 TCP 服务器。我想把它放在 Heroku 上,因为它是一项免费服务,我只需要他们的免费计划提供的东西。

现在,我对 Heroku 的内部运作知之甚少,而且我对整个事情还很陌生,所以我有几个问题。

首先,是否可以部署 TCP(非 Web)服务器?我读到 Heroku 不喜欢 node.js 的网络,因为它不支持 websockets,我应该使用 socket.io。

所以我把我的服务器切换到了socket.io。我认为。因为我的代码或多或少看起来是一样的。我也这样做了:https ://devcenter.heroku.com/articles/using-socket-io-with-node-js-on-heroku

我在我的 Procfile 中而不是“web”中放了什么?此外,当我尝试部署我目前拥有的东西时,日志显示我的应用程序无法绑定到 $PORT。什么是 $PORT?以及如何将其更改为我想要的端口?

事实上,如果我不更改它,我怎么知道它是什么,以便我的应用程序可以连接到这个服务器?

4

2 回答 2

5

Heroku 不支持通用 TCP 服务器,但您应该能够通过 socket.io 获得所需的功能。

您需要将 web 放入您的 Procfile 中。这就是让 Heroku 将外部连接绑定到端口 80 到您的网络流量将到达您的本地端口的原因。您可以通过查看环境变量 $PORT 找到该端口。更多信息和示例在这里:https ://devcenter.heroku.com/articles/nodejs

于 2013-09-04T01:50:45.880 回答
5

Heroku 的免费层不支持 TCP 服务器。这就是原因。

为了节省成本并提供免费服务,Heroku 在同一台机器上托管多个免费层应用程序。这些应用程序(其中之一是您的应用程序)共享相同的 IP 地址。这些应用程序被分配到不同的端口。

但是,您可能已经注意到,当您在浏览器中访问应用程序时,端口始终为 80。因此,要知道传入的 HTTP 请求正在寻找哪个应用程序,服务器必须查看 HTTP 标头。(例如,使用 HOST 查找应用名称,然后将应用名称解析为内部端口号。)

最后,Heroku 决定对互联网隐藏内部端口。这一点,加上 TCP 连接没有HOST字段的事实,使得使用 Heroku 托管 TCP 服务器是不可能的。

要解决此问题,请使用 WebSocket。

附录:研究

  • 测试是在 2020 年 3 月使用免费的 Heroku 应用程序完成的。
  • 如果您编造了一个不存在的应用程序名称(例如https://hr.herokuapp.com),Heroku 会以一个页面响应“这里什么都没有”。
  • 如果您首先手动操作nslookup现有应用程序(例如https://world-of-blogs.herokuapp.com),然后尝试使用 IP 地址访问该应用程序,Heroku 还会以页面响应“这里什么都没有。 "
于 2020-03-20T13:02:37.710 回答