将TCP服务器部署到Heroku

8
我有一个使用node.js编写的TCP服务器。我想将其部署到Heroku上,因为这是一个免费的服务,我不需要比他们免费计划提供的更多东西。
现在,我对Heroku的内部工作知之甚少,而且我对整个事情都很新,所以我有几个问题。
首先,是否可能部署TCP(非Web)服务器?我已经阅读了Heroku不喜欢node.js的net,因为它不支持websockets,我应该使用socket.io。
所以我已经切换到socket.io。我想。因为我的代码看起来差不多。我也做了这个:https://devcenter.heroku.com/articles/using-socket-io-with-node-js-on-heroku 在Procfile中,我应该放什么而不是“web”?此外,当我尝试部署当前的内容时,日志显示我的应用程序无法绑定到$ PORT。$PORT是什么?我如何将其更改为我想要的端口?
实际上,如果我不更改它,我怎么知道它是什么,以便我的应用程序可以连接到此服务器?

虽然Heroku默认不支持WebSockets,但是如果你已经安装了Toolbelt,你现在可以通过以下命令启用WebSockets:$ heroku labs:enable websockets -a myapp - Patrick Roberts
2个回答

6
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还会响应一个页面,上面写着“这里还没有什么东西”。

5
Heroku不支持通用TCP服务器,但您可以使用socket.io获得所需的功能。
您需要在Procfile中添加web。这样可以让Heroku将外部连接绑定到端口80,并将其传递到本地端口。您可以通过查看环境变量$PORT来找到该端口。有关更多信息和示例,请参见此处:https://devcenter.heroku.com/articles/nodejs

哦,所以$PORT只在我的服务器上使用?我的客户端应该连接到80端口,对吗? - Luka Horvat
没错。而且Heroku的路由系统会将80端口重定向到你自定义的端口。 - Dan Kohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接