具有 Java ECONNREFUSED 的 Heroku Websockets(连接被拒绝)

Heroku Websockets with Java ECONNREFUSED (Connection refused)

我正在使用 Java 编写一个小型游戏服务器。

我使用 TooTallNate-Java-Websockets 库来创建我的 websocket 服务器。 当我 运行 我的服务器在 localhost 时一切正常,当我将我的应用程序提交到 Heroku 时,我可以从 everywhere.However 连接到它,每次我尝试建立套接字连接时我都会收到错误 ECONNREFUSED(连接被拒绝).

值得一提的是,当我 运行 将我的应用程序与本应模拟 heroku 环境的 foreman 结合使用时,一切正常。

作为我的 websocket 服务器的端口,我尝试使用 80805000 之间的许多其他端口8000.

我只能猜测 heroku 上发生了什么,因为日志只包含 http 请求的基本信息。

请帮忙,我快要放弃了:(

编辑

这是我的 Proc 文件中的内容:

web: ./build/install/my-app/bin/my-app

更新 创建了一个简单的抽象应用程序来展示问题: (当然是在 foreman 测试过,在本​​地环境下也能正常工作)

  1. 我的 html/js 测试员:Testerpage
  2. 我的主要 java 码头服务器:Java Main
  3. 控制台错误消息: WebSocket connection to 'wss://test-websocket-yan.herokuapp.com:39773/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

您必须使用 Heroku 设置为 $PORT 环境变量的端口:

On Heroku, apps are completely self-contained and do not rely on runtime injection of a webserver into the execution environment to create a web-facing service. Each web process simply binds to a port, and listens for requests coming in on that port. The port to bind to is assigned by Heroku as the PORT environment variable.

更多请看:https://devcenter.heroku.com/articles/runtime-principles#web-servers

我正在回答我自己的问题,以分享我如何设法连接到 Heroku 上的 Java websocket 服务器。

  1. 使用 Java 创建您的网络套接字服务器,实现由您决定,您可以使用 javax 或 Jetty websockets 或 TooTallNate-Java-Websockets , I've used Jetty. Here is my implementation . I have followed this 示例。
  2. 当连接到 heroku 上的网络套接字时,请使用以下方案 ws:// + yourHerokuAppAdress + yourSocketEndpoint 。端点是你的 websocket 正在监听的相对地址,在我的例子中是 "/socket" 。无需指定端口 !

您可能只需要设置 REDIS_URL。在我的例子中是 REDISCLOUD_URL