2013-04-21 81 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