標籤:android style blog http color 使用 os io
轉自:http://blog.csdn.net/wangbin_jxust/article/details/9632771,http://blog.csdn.net/wangbin_jxust/article/details/9707873
連網遊戲開發中,經常遇到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兩個庫,編譯項目時也會出現報錯。
另外注意引入標頭檔:
#include "cocos-ext.h"
3.添加下載按鈕和回呼函數。添加下載按鈕:
CCMenuItemImage *pDownloadItem = CCMenuItemImage::create( "bt_blue_light.png", "bt_blue_light.png", this, menu_selector(HelloWorld::menuDownloadCallback) ); CC_BREAK_IF(!pDownloadItem); CCSize pWinSize = CCDirector::sharedDirector()->getWinSize(); CCMenu* pDownloadMenu = CCMenu::create(pDownloadItem, NULL); pDownloadMenu->setPosition(ccp(50 ,50)); CC_BREAK_IF(! pDownloadMenu); this->addChild(pDownloadMenu, 1);
添加按鈕的回呼函數:
void HelloWorld::menuDownloadCallback(CCObject* pSender){ cocos2d::extension::CCHttpRequest* request = new cocos2d::extension::CCHttpRequest(); request->setUrl("http://www.oschina.net/action/api/news_list"); request->setRequestType(cocos2d::extension::CCHttpRequest::kHttpPost); std::vector<std::string> headers; headers.push_back("Content-Type: application/json; charset=utf-8"); request->setHeaders(headers); const char* postData = "catalog=2&pageIndex=1&pageSize=5"; request->setRequestData(postData ,strlen(postData)); request->setResponseCallback(this, callfuncND_selector(HelloWorld::onHttpRequestCompleted)); request->setTag("Post_My_Data"); cocos2d::extension::CCHttpClient::getInstance()->send(request); request->release();}按鈕的回呼函數裡向伺服器發起http請求了,request->setResponseCallback(this, callfuncND_selector(HelloWorld::onHttpRequestCompleted))一行代碼,向請求結束時添加了onHttpRequestCompleted回呼函數4.為http request 結束增加回呼函數並讀取網路資料
void HelloWorld::onHttpRequestCompleted(cocos2d::CCNode *sender ,void *data){ AllocConsole(); freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); cocos2d::extension::CCHttpResponse *response = (cocos2d::extension::CCHttpResponse*)data; if (!response) { return; } if (0 != strlen(response->getHttpRequest()->getTag())) { CCLog("%s completed", response->getHttpRequest()->getTag()); } int statusCode = response->getResponseCode(); char statusString[64] = {}; sprintf(statusString ,"Http status code:%d ,tag = %s" ,statusCode ,response->getHttpRequest()->getTag()); CCLog("response code:%d" ,statusCode); if (!response->isSucceed()) { CCLog("response failed"); CCLog("error buffer:%s" ,response->getErrorBuffer()); } std::vector<char> *buffer = response->getResponseData(); printf("Http response,dump data:"); std::string result = ""; for (unsigned int i = 0; i < buffer->size(); i ++) { printf("%c" ,(*buffer)[i]); }}
debug時就能看到reponse中伺服器返回的資料了。
列印到表單中:
轉自:http://blog.csdn.net/sakana87320/article/details/8595242
概述使用CCHttpClient一般有6步:
- 建立CCHttpRequest執行個體。
- 設定Url和請求類型。
- 使用CCHttpClient向Url發出請求(串連Url)。
- 讀取響應。
- 釋放串連。
- 響應處理。
如何使用擷取CCHttpRequest執行個體
使用一個無參構造方法建立一個CCHttpRequest的執行個體。CCHttpRequest無參構造方法可以擷取一個預設設定的CCHttpRequest執行個體,該執行個體可以滿足大多數需求。
cocos2d::extension::CCHttpRequest* request = new cocos2d::extension::CCHttpRequest();
設定Url
request->setUrl("blog.csdn.net/sakana87320/article/details/8595242");
設定GET請求
//設定為GET請求:kHttpGetrequest->setRequestType(cocos2d::extension::CCHttpRequest::kHttpGet);//設定處理響應回呼函數request->setResponseCallback(this, callfuncND_selector(HttpClientTest::onHttpRequestCompleted));request->setTag("GET test");
設定POST請求
//設定為POST請求:kHttpPostrequest->setRequestType(cocos2d::extension::CCHttpRequest::kHttpPost);//設定處理響應回呼函數request->setResponseCallback(this, callfuncND_selector(HttpClientTest::onHttpRequestCompleted));request->setTag("POST test");
發送請求
cocos2d::extension::CCHttpClient::getInstance()->send(request);
處理返回資料(響應回呼函數)
void HttpClientTest::onHttpRequestCompleted(cocos2d::CCNode *sender, void *data){ CCHttpResponse *response = (CCHttpResponse*)data; if (!response) { return; } // 你可以使用: response->request->reqType擷取請求類型 if (0 != strlen(response->getHttpRequest()->getTag())) { CCLog("%s completed", response->getHttpRequest()->getTag()); } //擷取狀態代碼 int statusCode = response->getResponseCode(); char statusString[64] = {}; sprintf(statusString, "HTTP Status Code: %d, tag = %s", statusCode, response->getHttpRequest()->getTag()); m_labelStatusCode->setString(statusString); CCLog("response code: %d", statusCode); if (!response->isSucceed()) { //訪問失敗擷取錯誤資訊 CCLog("response failed"); CCLog("error buffer: %s", response->getErrorBuffer()); return; } // 擷取返回資料。 std::vector<char> *buffer = response->getResponseData(); printf("Http Test, dump data: "); for (unsigned int i = 0; i < buffer->size(); i++) { printf("%c", (*buffer)[i]); } printf("\n");}
釋放串連
request->release();
注意
Android平台下不要忘了添加訪問網路的許可權。