cocos2dx之Http网络编程(一)——网络请求的发送和接收

来源:互联网 发布:开淘宝怎么样找货源 编辑:程序博客网 时间:2024/05/29 12:59

转自:http://blog.csdn.net/pj1258/article/details/14523175

联网游戏开发中,经常遇到http编程,接下来就分三次对cocos2dx的网络编程进阶

本博文中先介绍建立基本的http通信并得到返回信息

1.创建cocos2dx工程。


2.项目引用外部库。

如果要使用cocos2dx的CCHttpClient来进行网络访问,则需要引入cocos2dx的相关库,详细步骤如下:

右键单击项目->属性->c/c++->常规,在右边的附件包含目录中添加cocos2dx的extensions目录对应的路径。

然后,右键单击项目->属性->链接器->输入,在右边的附件依赖项中添加libcurl_imp.lib和libExtensions.lib两个库,用分号隔开。

如果不引入extensions文件夹,会出现找不到CCHttpClient的错误;

如果不引入libcurl_imp.lib和libExtensions.lib两个库,编译项目时也会出现报错。

另外注意引入头文件:

 

[cpp] view plaincopyprint?
  1. #include "cocos-ext.h"  

3.添加下载按钮和回调函数。

添加下载按钮:
[cpp] view plaincopyprint?
  1. CCMenuItemImage *pDownloadItem CCMenuItemImage::create(  
  2.             "bt_blue_light.png" 
  3.             "bt_blue_light.png" 
  4.             this 
  5.             menu_selector(HelloWorld::menuDownloadCallback)  
  6.         );  
  7.         CC_BREAK_IF(!pDownloadItem);  
  8.         CCSize pWinSize CCDirector::sharedDirector()->getWinSize();  
  9.       
  10.         CCMenu* pDownloadMenu CCMenu::create(pDownloadItem, NULL);  
  11.         pDownloadMenu->setPosition(ccp(50  ,50));  
  12.         CC_BREAK_IF(! pDownloadMenu);  
  13.         this->addChild(pDownloadMenu, 1);  
添加按钮的回调函数:
[cpp] view plaincopyprint?
  1. void HelloWorld::menuDownloadCallback(CCObject* pSender)  
  2.  
  3.     cocos2d::extension::CCHttpRequest* request new cocos2d::extension::CCHttpRequest();  
  4.     request->setUrl("http://www.oschina.net/action/api/news_list");  
  5.     request->setRequestType(cocos2d::extension::CCHttpRequest::kHttpPost);  
  6.     std::vector headers;  
  7.     headers.push_back("Content-Type: application/json; charset=utf-8");  
  8.     request->setHeaders(headers);  
  9.     const charpostData "catalog=2&pageIndex=1&pageSize=5" 
  10.     request->setRequestData(postData ,strlen(postData));  
  11.     request->setResponseCallback(thiscallfuncND_selector(HelloWorld::onHttpRequestCompleted));  
  12.     request->setTag("Post_My_Data");  
  13.     cocos2d::extension::CCHttpClient::getInstance()->send(request);  
  14.     request->release();  
  15.  
按钮的回调函 数里向服务器发起http请求了,request->setResponseCallback(this, callfuncND_selector(HelloWorld::onHttpRequestCompleted))一行代码,向请求结束时添加了 onHttpRequestCompleted回调函数

4.为http request 结束增加回调函数并读取网络数据

[cpp] view plaincopyprint?
  1. void HelloWorld::onHttpRequestCompleted(cocos2d::CCNode *sender ,void *data)  
  2.  
  3.     AllocConsole();  
  4.     freopen("CONIN$""r"stdin);  
  5.     freopen("CONOUT$""w"stdout);  
  6.     freopen("CONOUT$""w"stderr);  
  7.     cocos2d::extension::CCHttpResponse *response (cocos2d::extension::CCHttpResponse*)data;    
  8.      if (!response)    
  9.      
  10.         return   
  11.       
  12.      if (0 != strlen(response->getHttpRequest()->getTag()))   
  13.      
  14.         CCLog("%s completed"response->getHttpRequest()->getTag());  
  15.      
  16.      int statusCode response->getResponseCode();  
  17.      char statusString[64] {};  
  18.      sprintf(statusString ,"Http status code:%d ,tag %s" ,statusCode ,response->getHttpRequest()->getTag());  
  19.      CCLog("response code:%d" ,statusCode);  
  20.      if (!response->isSucceed())  
  21.       
  22.          CCLog("response failed");  
  23.          CCLog("error buffer:%s" ,response->getErrorBuffer());  
  24.       
  25.      std::vector<char> *buffer response->getResponseData();  
  26.      printf("Http response,dump data:");  
  27.      std::string result "" 
  28.      for (unsigned int 0; buffer->size(); ++)  
  29.       
  30.         printf("%c" ,(*buffer)[i]);  
  31.       
  32.  


 

debug时就能看到reponse中服务器返回的数据了。

打印到窗体中:


如果还不知道如何打印到窗口,请参考:cocos2dx输出Log的几种方法

至此,我们第一步已经完成。

0 0
原创粉丝点击