cocos2dx Http網路編程

來源:互聯網
上載者:User

標籤: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步:
  1. 建立CCHttpRequest執行個體。
  2. 設定Url和請求類型。
  3. 使用CCHttpClient向Url發出請求(串連Url)。
  4. 讀取響應。
  5. 釋放串連。
  6. 響應處理。
如何使用擷取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平台下不要忘了添加訪問網路的許可權。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.