Cloudfoundry上的非HTTP TCP连接

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

所以基本上我试图Cloudfoundry(Node.js)和我的机器(lua)之间的非HTTP TCP连接。

链接到Noobhub(有一个github回购与服务器和客户端实施。

我在做

客户

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

(45234来自服务器的process.env.VCAP_APP_PORT值,我从控制台输出中检索到,在运行应用程序之后通过“vmc logs myappname”得到。

服务器

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

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

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

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

服务器

 ... server.listen(8989) 

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

我尝试了很多其他的方法,例如将客户端的端口连接设置为80以及其他一些。 我看到了一些资源,但没有一个能够解决这个问题。 我通常会打电话问问题,所以如果你需要更多的信息,请问我!

PS

D:<,这是一个问题,显示了另一个人发布的类似问题。

无法连接到CloudFoundry上的TCP服务器(localhost node.js工作正常)

从这里我可以看出,这个人正在尝试做类似的事情。 select的答案是否意味着我必须使用主机头(即使用http协议)来连接? 这是否也意味着cloudfoundry将不会支持“真”TCP套接字,就像heroku或应用雾?

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

我工作的方法是用HTTP服务器监听CF提供的端口,然后把Websocket服务器(在我的例子中是websocket.io)附加到它。 我已经创build了可以在本地和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的帮助下设置 )为了testing这个回声websocket服务器,我使用了简单的index.html文件,它连接到服务器并发送消息(一切都logging进入控制台):

 <!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 (eg 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)的文本框中input服务器地址,按下Connectbutton,我们就可以通过TCP工作Websocket连接,通过发送Ping和接收回声来testing。 这在Chrome中运行良好,但是IE 10和Firefox有一些问题。

那么对于“TRUE”TCP套接字,没有确切的信息:根据最后一段, 在这里你不能使用除了80和443(HTTP和HTTPS)之外的任何端口与Cloud Foundry之外的应用进行通信,这使我认为TCP套接字无法实现。 然而,根据这个答案,你实际上可以使用任何其他的端口…似乎需要对这个问题进行深入的调查…

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

我决定用pubnub来满足我所有的消息需求。