node.js - 将 TCP 服务器部署到 Heroku

标签 node.js heroku tcp socket.io

我有一个用 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”?此外,当我尝试部署我当前拥有的内容时,日志显示我的应用程序无法绑定(bind)到 $PORT。 $PORT 是什么?以及如何将其更改为我想要的端口?

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

最佳答案

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

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

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

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

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

附录:研究

  • 测试是在 2020 年 3 月使用免费层级的 Heroku 应用完成的。
  • 如果您编造了一个不存在的应用程序名称(例如 https://hr.herokuapp.com ),Heroku 会返回一个页面,显示“这里还没有任何内容”。
  • 如果您首先手动 nslookup 一个现有的应用程序(例如 https://world-of-blogs.herokuapp.com ),然后尝试使用 IP 地址访问该应用程序,Heroku 也会响应一个页面说“这里没有任何内容,但是”

关于node.js - 将 TCP 服务器部署到 Heroku,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18600814/

相关文章:

windows - 使用VLC的虚拟界面时如何防止显示控制台

javascript - 从 Javascript 中的 C float 组读取原始字节(转换为 JS 数组)

node.js - 如果 Readable.pipe() 返回一个 Writable,我们如何链接管道?

ruby-on-rails - 通过终端销毁特定用户 - ROR & Heroku

tcp - 测量单个 TCP 连接的丢包数

使用 Songkick API JSON.parse() 因意外 token 而失败

git push 推送到远程仓库时出错

git - "unqualified destination"git 子树推送错误

c - C中的TCP套接字编程,其中服务器在cloud9中运行,客户端在本地计算机中运行

python - 如何使用 python 脚本更改 tcp keepalive 计时器?