cocos2d-x node.js 초간단 Http 통신

 cocos2d-x 기반 클라이언트에서 node.js 서버와의 간단한 http 통신하는 것을 정리해봅니다. url을 바탕으로 쿼리 스트링을 파싱해서 id값을 추출 후 'Hello ' + id 정도의 문자열 데이터를 다시 cocos2d-x에 보내주는 간단 허접 웹 서버입니다.

 그런데 사실 node.js 웹 서버라봐야 너무 간단하고, cocos2d-x도 이미 pthread와 semaphore를 사용한 CCHttpClient, CCHttpRequest, CCHttpResponse를 만들어놔서 비동기로 처리할 수 있게 잘 모듈화 해놨네요. 작년에 한참 libcurl로 파일 패치 받는 것 처리할때는 cocos2d-x에 curl 초간단 샘플만 있었는데 말이죠. 추후 제가 만든 패치시스템쪽 curl 사용하는 부분 리팩토링이 필요해보입니다.

 언제나 그렇듯 제 기억력이 그리 좋지 않아 정리하는 것이므로 딱 FM 강좌식이 아닌 이슈 같은 기타 내용도 포함 됩니다. 또한 node.js는 이제 책보고 R&D중이고해서 기능 하나하나 설명식은 아닙니다. 그리고 java script나 기타 웹 관련 지식은 전무한 상태에서 진행됨을 미리 알려드립니다.

 허접한 내용이므로 이미 웹 서버 또는 node.js 개발자이신분들은 패스 하셔도 됩니다. 저처럼 클라이언트 개발자였다가 cocos2d-x + node.js 궁합으로 작업하시는 분들을 위해 정리하는 것이니까요. 패스하실분들은 제일 아래 제 넋두리나 보시면 됩니다 ^^; 잡설은 고만하고 시작해봅니다.


1. node.js Http Server

 node.js 웹 서버로 이미 널리고 널린 간단한 서버소스이고하니 설명은 주석으로 대체합니다.



var http = require('http');
var url = require('url');

var server = http.createServer();

server.listen(3000, function(){
    console.log('Start Server Listen...');
});

///< 책들 보면 createServer하면서 바로 처리하던데, 난 이런 명시적인게 좋다.
server.on('request', function(req, res){
    console.log('on request');
    if( req.method != 'POST' ){
        return;
    }
    ///< cocos2d-x에서 보낸 post data
    req.on('data', function(chunk){
        console.log('on data ' + chunk.toString());
    });
 
    /* Header는 안해도 되네?
    res.writeHead(200
     , {'content-type':'text/plain'});
    */
    ///< url 쿼리 스트링을 json으로 파싱
    var json = url.parse(req.url, true).query;
    console.log(json);
 
    ///< cocos2d-x에 id를 붙여줘서 response한다.
    res.end('Hello ' + json['id']);
 
    console.log('end req');
});
2. cocos2d-x HttpClientTest 수정

 TestCPP 샘플을 아래처럼 몇가지를 수정해줍니다. 간단하게 서버로 쿼리 문자열 추가해서 날려주는게 다죠. 역시나 설명은 주석으로 대체합니다. bold 처리한 부분을 보시면 됩니다.


void HttpClientTest::onMenuPostTestClicked(cocos2d::CCObject *sender)
{
    // test 1
    {
        CCHttpRequest* request = new CCHttpRequest();
        //request->setUrl("http://www.httpbin.org/post");
        ///< node.js 서버 주소로 변경하고, 쿼리 스트링 문자열을 간단히 추가한다.
        request->setUrl("http://xxx.xxx.xxx.xxx:3000/?id=wwforever&password=cocos2dx");

...
...

void HttpClientTest::onHttpRequestCompleted(cocos2d::CCNode *sender, void *data)
{
..
..

// dump data
    std::vector *buffer = response->getResponseData();
    printf("Http Test, dump data: ");

    ///< 아래 printf는 콘솔창이 없으므로 버퍼를 로그로 출력해보자. 
    CCLog(&buffer->front());

    for (unsigned int i = 0; i < buffer->size(); i++)
    {
        printf("%c", (*buffer)[i]);
    }
    printf("\n");
3. 실행
 cocos2d-x 샘플 스샷이죠. 이미 Test Post 버튼을 누른 후의 스샷입니다.

 맥에서 구름 IDE로 띄운 서버의 Terminal 스샷입니다.

{id:'wwforever', password:'cocos2dx'} 이렇게 json형식으로 나온것이


    var json = url.parse(req.url, true).query;
    console.log(json);


 서버부분이고

request->setUrl("http://xxx.xxx.xxx.xxx:3000/?id=wwforever&password=cocos2dx");

 이게 클라부분이죠. 클라이언트 로그를 보겠습니다.

POST test1 completed
response code: 200
Hello wwforever?????????????????

POST test2 completed
response code: 200
{
  "files": {},
  "headers": {
    "Content-Type": "application/json; charset=utf-8",
    "Accept": "*/*",
    "Host": "www.httpbin.org",
    "Content-Length": "53",
    "Connection": "close"
  },
  "url": "http://www.httpbin.org/post",
  "args": {},
  "form": {},
  "origin": "10.13.34.230",
  "json": null,
  "data": "visitor=cocos2d&TestSuite=Extensions Test/NetworkTest"
}???????????????

POST test2 completed는 볼 필요없고 test1 결과를 보시면됩니다. 서버에서     res.end('Hello ' + json['id']); 보내줬던게 buffer에 있는 것을 로그로 남겨본 것이죠. 뒤에 ??????? 쭉 있는건 버퍼에 널문자가 안 들어가 있나보네요. 귀찮으니 패스.

 이걸로 간단하게 Http통신을 해봤는데, 사실 이걸로 뭔가 할 수 있는건 아직 없네요. 그리고 뭔가하더라도 저렇게 Http 쿼리스트링을 게임 만드는데 사용하진 않겠죠.
  • session 처리를 node.js에서 지원해주는 session으로 해야하나 아니면 socket.io로해야하나?
  • http는 임의로 먼저 서버에서 클라로 보내는 것이 안되는 단방향 통신인거 같은데 서버에서 특정이벤트같은거 클라로 보내려면 polling 방식?을 써야하나 아님 역시나 socket.io를 써야하나?
  • socket.io를 하게되면 cocos2d-x에 붙일 socket.io c++ lib를 찾아봐야할테고...
  • 쿼리 문자열로 통신할순 없으니 json도 R&D 해야겠네. cocos2d-x에 적용할 json c++ lib도 찾아봐야겠지.
  • 아니면 REST API인지 RESTful인지 그냥 REST인지 뭐 그런 개념인지 규약인지가 있다는데 이걸로 해야하는건가?
  • 각종 DB들 redis, mongodb.....
  • node.js, java script도 익숙해져야지....
  • 기타 어떤 서버 개발 이슈가 나올지 등등 휴....
 이제부터 시작인데, 지금 상황에 대한 넋두리 좀 풀어봤네요. 작년에 cocos2d-x 통합 프레임워크 같이 모듈화하는 프레임워크는 아니고 서버는 따로 프레임워크 개발없이 일단 결과물 위주로 개발하는 방향으로 해봐야겠네요. 물론 만든 서버와 연동하는 cocos2d-x 클라이언트딴은 기존 프레임워크의 기능을 추가개선해야겠죠.

댓글

이 블로그의 인기 게시물

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

goorm IDE에서 node.js 프로젝트로 Hello World Simple Server 만들어 띄워보기

애드센스 수익을 웨스턴 유니온으로 수표대신 현금으로 지급 받아보자.