cocos2dx Http網絡編程


轉自:http://blog.csdn.net/wangbin_jxust/article/details/9632771http://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請求:kHttpGet
request->setRequestType(cocos2d::extension::CCHttpRequest::kHttpGet);
//設置處理響應回調函數
request->setResponseCallback(this, callfuncND_selector(HttpClientTest::onHttpRequestCompleted));
request->setTag("GET test");

設置POST請求

//設置為POST請求:kHttpPost
request->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平台下不要忘了添加訪問網絡的權限。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM