2013-04-21 2 views
2

나는 cloudboundry의 서비스를 이용하여 채팅 및 문자 이동을 처리하기 위해 서버를 실행하려고하는 멍청한 모바일 개발자입니다. Noobhub을 사용하여 Node.js와 Corona SDK의 TCP 연결 API를 사용하여 서버와 클라이언트 간의 TCP 연결을 구현했습니다.Cloudfoundry에서 비 -HTTP 연결

기본적으로 Cloudfoundry (Node.js) 와 내 컴퓨터 (루아). 내가

를하고있는 중이 야

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

클라이언트

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

(45234 내가 실행 한 후 "VMC 로그 myappname"을 가지고 내가 콘솔 출력에서 ​​검색 서버의 process.env.VCAP_APP_PORT 값에서입니다 응용 프로그램)

서버

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

연결하려고하면 시간이 초과됩니다. 클라이언트 예상대로

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

서버

... 
server.listen(8989) 

작품을하고 내 로컬 컴퓨터에

. 클라우드 기반에서 작동하지 않습니다.

클라이언트의 포트 연결을 80이나 다른 여러 가지로 설정하는 것과 같은 다른 방법을 시도했습니다. 나는 약간의 자원을 보았지만 그들 중 아무도 그것을 해결하지 못했습니다. 나는 질문을 할 때마다 큰소리를 내며, 더 많은 정보가 필요하면 나 한테 물어봐!

P.

화난 얼굴 D : <으로 나에게이 링크를 던지기 전에 다른 사람이 게시 한 비슷한 문제를 보여주는 질문입니다.

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

여기에서, 나는이 사람이 내가 뭐하고 있었 비슷한 일을하려고했던 것을 볼 수 있습니다. 선택한 답변은 연결에 호스트 헤더 (예 : http 프로토콜 사용)를 사용해야한다는 의미입니까? cloudfoundry가 heroku 나 app ​​fog처럼 "TRUE"TCP 소켓을 지원하지 않는다는 것을 의미합니까?

답변

3

사실, process.env.VCAP_APP_PORT 환경 변수는 브라우저 경로 (예 : nodejsapp.vcap)에 따라 Cloud Foundry L7 라우터 (nginx)에서 HTTP 트래픽을 리디렉션 할 포트를 제공합니다.나 : 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."); }); 
}); 

같은 디렉토리에 npm install websocket.io 명령을 실행 설치할 수 종속성 lib 디렉토리 websocket.io입니다. 또한 CF 인수 배포 설명하는 manifest.yml 파일이 : 그래서

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

,이 디렉토리에 배치 된 응용 프로그램에서 cf push를 실행 내 로컬 CFv2 인스턴스이 에코 웹 소켓 서버를 테스트하려면 (cf_nise_installer의 도움으로 설정가) 내가 서버에 연결 (모든 것이 콘솔에 로그인) 메시지를 보내는 간단한 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 내 경우), Connect 버튼을 누르면 우리는 Ping을 보내고 에코를 수신하여 테스트 할 수있는 TCP를 통해 Websocket 연결을 수행합니다. Chrome에서 잘 작동했지만 IE 10 및 Firefox에는 몇 가지 문제가있었습니다.

"TRUE"TCP 소켓은 정확한 정보가 없습니다. 마지막 단락 here에 따르면 80 및 443 (HTTP 및 HTTPS) 이외의 포트를 사용하여 Cloud Foundry 외부의 앱과 통신 할 수 없습니다. TCP 소켓을 구현할 수 없다고 생각하게 만듭니다. 그러나 this 답변에 따르면 실제로 다른 포트를 사용할 수 있습니다 ...이 질문에 대한 몇 가지 심층 조사가 필요합니다 ...

+0

POST/VCAP_APP_PORT 환경 변수에 반영된 포트를 수신 대기하는 소켓을 통해 HTTP (또는 잠재적으로 웹 소켓)를 사용하여 Cloud Foundry 응용 프로그램에 "연결할"수 있습니다. "모든"TCP 기반 프로토콜을 사용할 수 없습니다. –

+1

"모든"TCP 기반 프로토콜을 사용하여 Cloud Foundry에서 호스팅되는 응용 프로그램과 다른 플랫폼간에 "대화"할 수 있습니다. –

+0

좋아요. 그러나'VCAP_APP_PORT'는 더 이상 사용되지 않습니다. 변수의 이름은 이제'PORT'입니다. https://docs.run.pivotal.io/devguide/deploy-apps/environment-variable.html#VCAP-APP-PORT에서 알림을 참조하십시오. – JellicleCat

-2

"Cloud Foundry는 클라이언트와 앱 사이에 L7 라우터 (ngnix)를 사용합니다. 라우터는 요청을 앱에 전달하기 전에 HTTP를 구문 분석해야합니다.이 방법은 WebSocket과 같은 HTTP 프로토콜이 아닌 경우에는 작동하지 않습니다. js는이 문제와 관련이 있지만 Cloud Foundry의 현재 아키텍처에는 쉬운 수정이 없습니다. " - http://www.subbu.org/blog/2012/03/my-gripes-with-cloud-foundry

필자는 모든 메시징 요구 사항을 충족시키기 위해 pubnub와 함께 가기로 결정했습니다.

+3

이 정보는 현재 구식입니다. Cloud Foundry v2는 Go에서 구현되고 HTTP와 WebSocket을 모두 지원하는 새로운 라우터를 사용합니다. 그러나 WebSocket을 지원하도록 구성해야하므로 호스팅 된 버전의 Cloud Foundry에 의존하는 경우 호스트가이 옵션을 활성화했습니다. –

관련 문제