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 웹 서버로 이미 널리고 널린 간단한 서버소스이고하니 설명은 주석으로 대체합니다.
TestCPP 샘플을 아래처럼 몇가지를 수정해줍니다. 간단하게 서버로 쿼리 문자열 추가해서 날려주는게 다죠. 역시나 설명은 주석으로 대체합니다. bold 처리한 부분을 보시면 됩니다.
그런데 사실 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 쿼리스트링을 게임 만드는데 사용하진 않겠죠.
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 클라이언트딴은 기존 프레임워크의 기능을 추가개선해야겠죠.
댓글
댓글 쓰기