CloudFoundry websocket失败:通过代理服务器建立隧道失败

时间:2016-11-19 12:16:17

标签: java cloudfoundry embedded-jetty pivotal-cloud-foundry

注意:我没有使用Pivotal CF。

我在CloudFoundry上部署了一个java应用程序。我使用嵌入式Jetty来托管我的Jersey REST API。默认情况下,此API由云代工厂在端口8080上公开。

我的应用程序还需要一些websockets来将数据流式传输到浏览器。我正在使用Java-WebSocket(https://github.com/TooTallNate/Java-WebSocket)。在我的本地机器上,我使用端口8887进行websocket连接。一切都很好。

在CloudFoundry上部署后,我可以访问我的REST API,但不能访问我的websocket。在线搜索后,我发现只允许在端口4443上使用websocket连接(http://docs.run.pivotal.io/release-notes/

我改变了我的服务器端以反映这个

fExtract <- function(dat, indexDat){
                 dat[as.matrix(indexDat)]
            }
fExtract(df, pos)
#[1]  6  4 15

在我的客户端,我使用以下

连接websocket
import org.java_websocket.server.WebSocketServer;
public class MyWebSocket extends WebSocketServer {
    public MyWebSocket() throws UnknownHostException {
        super(new InetSocketAddress(4443));
    }

    @Override
    public void onOpen(org.java_websocket.WebSocket websocket, ClientHandshake handshake) {
      // Handle this
      }
}

但我得到以下异常。

  

WebSocket与&#39; wss://my_cf_app.com的连接:4443 /&#39;失败:   通过代理服务器建立隧道失败

我还尝试使用&#34; PORT&#34;来连接服务器端的websocket。 CF的环境变量,但我得到了#34;地址已经在使用&#34; Java-WebSocket中的错误。

我尝试了很多不同的东西,但我无法弄清楚这一点。任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

  

在CloudFoundry上部署后,我可以访问我的REST API,但不能访问我的websocket。在线搜索后,我发现只允许在端口4443上使用websocket连接(http://docs.run.pivotal.io/release-notes/

端口4443特定于Pivotal Web服务(以及在AWS上运行的一些CF安装)。大多数PCF安装没有单独的WSS端口,但只使用443和HTTPS流量。使用的端口最终取决于CF安装前使用的负载平衡器及其支持的内容。

从不让您的应用程序侦听端口4443.端口4443是负载均衡器侦听的流量的外部端口。此流量将定向到分配给您的应用程序的端口,即$ PORT(env变量)。

  

我还尝试使用CF的“PORT”环境变量连接服务器端的websocket,但我在Java-WebSocket中得到“Address in in use”错误。

这是正确的行为,即您应该监听通过$ PORT env变量分配的端口。错误告诉你的是,某些东西已经在监听这个端口,你不能在同一个端口上监听两件事。

此时每个应用程序只有一个端口(将来可能会更改)。目前,如果您有两个独立的应用程序在两个独立的端口上进行侦听,那么您需要将它们作为两个单独的应用程序推送到CF.

如何使它们看起来像最终用户的一个应用程序是将每个应用程序映射到特定路径。请参阅--route-path的{​​{1}}参数或cf push的文档。

https://docs.cloudfoundry.org/devguide/deploy-apps/routes-domains.html#create-route