2013-04-21 80 views
2

我是一个努力的移动开发者,试图利用cloudfoundry的服务来运行我的服务器来处理一些聊天和角色移动。 我使用Noobhub来实现这一点(使用Node.js和Corona SDK的TCP连接API在服务器和客户端之间的TCP连接)Cloudfoundry上的非HTTP TCP连接

所以基本上我试图在Cloudfoundry(Node.js)和我的机器(lua)。

Link to Noobhub(There is a github repo with server AND client side implementation.

我做

客户

... 
socket.connect("myappname.cloudfoundry.com", 45234) 
... 

(45234是我从控制台输出检索到的服务器的process.env.VCAP_APP_PORT值I “VMC日志myappname” 跑了后)

服务器

... 
server.listen(process.env.VCAP_APP_PORT) 

当我尝试连接时,它只是超时。

在我的本地机器上,这样做 客户

... 
socket.connect("localhost",8989) 

服务器

... 
server.listen(8989) 

按预期工作。它只是在cloudfoundry,它不起作用。

我尝试了一堆其他的方法来做到这一点,例如将客户端的端口连接设置为80以及其他一些方法。我看到了一些资源,但他们都没有解决它。 我通常会提问,所以如果你需要更多的信息,请问我!

P.S.

在您将此链接以愤怒的脸D:<丢给我之前,下面的问题显示了另一个人发布的类似问题。

cannot connect to TCP server on CloudFoundry (localhost node.js works fine)

从这里,我可以看到,这家伙正在试图做我在做类似的事情。 所选答案是否意味着我必须使用主机头(即使用http协议)来连接?这是否也意味着cloudfoundry不会支持像Heroku或App雾一样的“TRUE”TCP套接字?

回答

3

实际上,process.env.VCAP_APP_PORT环境变量为您提供了端口,您的HTTP流量将根据您的应用程序路由(例如nodejsapp.vcap)由Cloud Foundry L7路由器(nginx)重定向到该端口。me:80被重定向到虚拟机上的process.env.VCAP_APP_PORT端口),所以你绝对不应该将它用于TCP连接。这个端口应该用来监听HTTP流量。这就是为什么你的例子在本地工作并且不适用于Cloud Foundry。

我工作的方法是用HTTP服务器监听CF提供的端口,然后将WebSocket服务器(在下面的示例中为websocket.io)附加到它。我已经创建了可在本地和CF中使用的示例回显服务器。我叫example.js Node.js的文件的内容是

var host = process.env.VCAP_APP_HOST || "localhost"; 
var port = process.env.VCAP_APP_PORT || 1245; 

var webServerApp = require("http").createServer(webServerHandler); 
var websocket = require("websocket.io"); 
var http = webServerApp.listen(port, host); 
var webSocketServer = websocket.attach(http); 

function webServerHandler (req, res) { 
    res.writeHead(200); 
    res.end("Node.js websockets."); 
} 
console.log("Web server running at " + host + ":" + port); 

//Web Socket part 
webSocketServer.on("connection", function (socket) { 
    console.log("Connection established."); 

    socket.send("Hi from webSocketServer on connect"); 

    socket.on("message", function (message) { 
     console.log("Message to echo: " + message); 
     //Echo back 
     socket.send(message); 
    }); 

    socket.on("error", function(error){ 
     console.log("Error: " + error); 
    }); 

    socket.on("close", function() { console.log("Connection closed."); }); 
}); 

的依赖LIB websocket.io可以安装在同一个目录中运行npm install websocket.io命令。也有一个manifest.yml文件,该文件描述了CF部署参数:

--- 
applications: 
- name: websocket 
    command: node example.js 
    memory: 128M 
    instances: 1 
    host: websocket 
    domain: vcap.me 
    path: . 

因此,运行从这个目录中部署应用程序cf push我的本地CFv2实例(建立与cf_nise_installer帮助) 为了测试这种回声的WebSocket服务器,我用简单的index.html文件,连接到服务器并发送消息(一切都登录到控制台):

<!DOCTYPE html> 
    <head> 
     <script>   
     var socket = null; 
     var pingData = 1; 
     var prefix = "ws://"; 

     function connect(){ 
      socket = new WebSocket(prefix + document.getElementById("websocket_url").value); 
      socket.onopen = function() { 
       console.log("Connection established"); 
      }; 
      socket.onclose = function(event) { 
       if (event.wasClean) { 
        console.log("Connection closed clean"); 
       } else { 
        console.log("Connection aborted (e.g. server process killed)"); 
       } 
        console.log("Code: " + event.code + " reason: " + event.reason); 
       };    
      socket.onmessage = function(event) { 
       console.log("Data received: " + event.data); 
      }; 
      socket.onerror = function(error) { 
       console.log("Error: " + error.message);    
      }; 
     }   
     function ping(){ 
      if(!socket || (socket.readyState != WebSocket.OPEN)){ 
       console.log("Websocket connection not establihed"); 
       return; 
      }    
      socket.send(pingData++); 
     }   
     </script> 
    </head> 
    <body> 
     ws://<input id="websocket_url"> 
     <button onclick="connect()">connect</button> 
     <button onclick="ping()">ping</button> 
    </body> 
</html> 
做左

唯一要做的就是输入服务器地址到Index页的文本框(websocket.vcap .me in我的情况),按连接按钮,我们已经通过TCP工作Websocket连接,可以通过发送Ping和接收回声来测试。这在Chrome中运行良好,但IE 10和Firefox出现了一些问题。

对于“TRUE”TCP套接字,没有确切的信息:根据最后一段here,除了80和443(HTTP和HTTPS)之外,不能使用任何端口与Cloud Foundry外部的应用程序进行通信让我觉得TCP套接字无法实现。但是,根据this的回答,你实际上可以使用任何其他端口......似乎需要深入调查这个问题...

+0

您可以使用HTTP(或可能是WebSockets)通过侦听POST/VCAP_APP_PORT环境变量中反映的端口的套接字“进入”Cloud Foundry应用程序。您不能使用“任何”基于TCP的协议。 – 2013-07-31 15:11:24

+1

您可以使用“任何”基于TCP的协议,将托管在Cloud Foundry上的应用程序“出”到任何其他平台。 – 2013-07-31 15:11:48

+0

太好了。但是'VCAP_APP_PORT'已被弃用;变量的名称现在是'PORT'。请参阅https://docs.run.pivotal.io/devguide/deploy-apps/environment-variable.html#VCAP-APP-PORT中的通知 – JellicleCat 2016-08-17 15:13:50

-2

“Cloud Foundry在客户端和应用程序之间使用L7路由器(ngnix)。路由器在将请求路由到应用程序之前需要先解析HTTP,但这种方法不适用于非Web协议的HTTP协议。 js将会遇到这个问题,但目前的Cloud Foundry架构没有简单的修复。“ - http://www.subbu.org/blog/2012/03/my-gripes-with-cloud-foundry

我决定和pubnub一起满足我所有的消息需求。

+3

此信息已过时。 Cloud Foundry v2使用在Go中实现的新路由器,它支持HTTP和WebSockets - 但是,它需要配置为支持WebSocket,因此如果您依赖托管版本的Cloud Foundry,则需要确保主机已启用此选项。 – 2013-07-31 15:10:07