【问题标题】:cannot connect to TCP server on CloudFoundry (localhost node.js works fine)无法连接到 CloudFoundry 上的 TCP 服务器(localhost node.js 工作正常)
【发布时间】:2013-03-04 04:11:51
【问题描述】:

我无法连接到在 CloudFoundry 上运行的 TCP 服务器示例。在本地 node.js 安装上运行我的 app.js 文件时,它工作得很好。具体来说,当我使用 vmc push 运行 CloudFoundry 时,服务会启动并且不会崩溃。一些 IP 连接到它,然后断开连接,据我所知,该服务继续运行。

我无法使用“telnet”和“nc”连接到它(请注意,当定向到 localhost node.js 服务器时,这两个都可以正常工作。

这失败了:

> nc themagicsandbox2.cloudfoundry.com 8124

这行得通

> nc localhost 8124
hello from TCP server! (intended reply)

我的代码在这里提交,Cloud Foundry stdout.log 在它下面提交。

代码:

myTrace('loaded'); // myTrace prepends timestamp to text and sends to console.log

var tcpServer = require('net').createServer(function(sock) { //'connection' listener
    sock.on('connect', function() {
        myTrace('client ' + sock.remoteAddress + ':' + sock.remotePort +' connected');
        sock.write('hello from TCP server!\r\n');
        sock.pipe(sock);
      });

    sock.on('end', function() {
        myTrace('client disconnected');
      });
  });



tcpServer.listen(8124, process.env.VCAP_APP_HOST || "localhost");

tcpServer.on('listening', function() {
      myTrace('server is listening - bound!');
    });

tcpServer.on('error', function(err) {
     myTrace('server err: ' + err);
     if (err.code == 'EADDRINUSE') {
       myTrace('Address in use, retrying ...');
       setTimeout(function() {
           tcpServer.close(function (err) {
               myTrace('server.close: ' + err);
             });
           tcpServer.listen(SLIDEIN_TCP_PORT, process.env.VCAP_APP_HOST || "localhost");
         }, 1000);
     }
  });

tcpServer.on('close', 
          function() {
            myTrace('server has closed');
             });

stdout.log (CloudFoundry):

Getting file contents... OK

Fri Mar 15 2013 11:59:02 GMT+0000 (UTC) loaded
Fri Mar 15 2013 11:59:02 GMT+0000 (UTC) server is listening - bound!
Fri Mar 15 2013 11:59:03 GMT+0000 (UTC) client 172.30.50.10:31840 connected
Fri Mar 15 2013 11:59:03 GMT+0000 (UTC) client disconnected

标准输出(本地节点.js):

Fri Mar 15 2013 12:57:39 GMT+0100 (CET) loaded
Fri Mar 15 2013 12:57:39 GMT+0100 (CET) server is listening - bound!
Fri Mar 15 2013 12:57:53 GMT+0100 (CET) client 127.0.0.1:52260 connected
Fri Mar 15 2013 12:57:59 GMT+0100 (CET) client disconnected
Fri Mar 15 2013 12:58:00 GMT+0100 (CET) client 127.0.0.1:52261 connected
Fri Mar 15 2013 12:58:01 GMT+0100 (CET) client disconnected

【问题讨论】:

    标签: javascript node.js tcp cloud-foundry


    【解决方案1】:

    这是因为请求使用主机标头路由到您的应用程序,netcat 或 telnet 都不会发送。当向其中任何一个发出请求时,您可能会从路由器返回 504。

    【讨论】:

    • 是的,没错,我只收到 504(连接超时),谢谢。我将编写一个使用主机头的测试程序。
    • 嗨,丹,我没有忘记你。我没有按“接受”,因为我还没有设法根据您的建议实施可行的解决方案。我现在做就好了。谢谢!
    • 我也不明白我在 stdout.log 中看到的连接是什么。
    • 当然,您在标准输出中看到的连接是路由器用来连接到您的应用程序的内部端口,就像您使用 Apache 或 Nginx 之类的东西代理到某种应用程序服务器时一样.
    【解决方案2】:

    我试图通过使用单向的 UDP 来解决这个问题,它涵盖了该服务器的需求,它可以使用仅接收协议来接收数据。

    但是,UDP 永远不会在 CloudFoundry.com 上工作,因为端口没有打开。

    在此处查看评论线程: Only the HTTP and HTTPS ports are open for an app to use on Cloud Foundry

    看来我又回到了通过 HTTP 向这个服务器发送数据,摆脱 HTTP 握手是首先编写这个 TCP 服务器的根本原因。

    【讨论】:

    • UDP 是双向的,只是不是面向会话或流的。但它不能工作的原因与 TCP 流不能工作的原因相同。
    【解决方案3】:

    我认为问题在于您的 TCP 客户端和 cloudFoundry 应用程序之间存在代理或 HTTP 重定向器。

    Dan Highman 的回答是,重定向由 HOST“标头”控制,这是基于重定向器假定您的客户端正在使用 HTTP 协议并具有“主机”标头记录以允许它找出哪个您想与之交谈的 cloudFoundry 应用。

    我想您是在问如何获得与应用程序的非 HTTP TCP 连接。我也没有想通。 VCAP_APP_HOST 环境变量提供了一个私有 IP 地址(即在私有 10.0.0.0 子网中),因此这对于从公共互联网到云主机没有用处。 (这对于由同一云主机网络提供服务的应用程序之间的通信可能很有用。)

    【讨论】:

      猜你喜欢
      • 2012-01-20
      • 2018-10-28
      • 2013-11-20
      • 2019-12-29
      • 1970-01-01
      • 2021-02-17
      • 2021-12-18
      • 2010-09-12
      • 2012-11-30
      相关资源
      最近更新 更多