cocos2d-x自帶的CCHttpClient下載百度網頁並寫入成網頁文件

cocos2d-x自帶的CCHttpClient下載百度網頁並寫入成網頁文件

        基於cocos2d-x做的網絡遊戲越來越多,移動設備的聯網一般使用的是http連接,cocos2d-x自帶了CCHttpClient作爲http連接,這裏我們就用它做一個簡單的小例子,http請求連接到百度,然後把返回的數據寫成一個叫做baidu.html的文件,然後打開它,用以模擬與服務器的交互。

1.新建一個cocos2d-x的空工程,然後新建一個類,名字叫做HttpConnectToBaidu,下面就是我寫的代碼,直接粘貼過來吧。

HttpConnectToBaidu.h
//
//  HttpConnectToBaidu.h
//  TestHttpToBaidu
//
//  Created by 江南岸 on 13-3-19.
//
//

#ifndef __TestHttpToBaidu__HttpConnectToBaidu__
#define __TestHttpToBaidu__HttpConnectToBaidu__

#include <iostream>
#include "cocos2d.h"
#include "HttpClient.h"
#include "HttpRequest.h"

USING_NS_CC;

USING_NS_CC_EXT;

class HttpConnectToBaidu :public CCObject
{
public:
    HttpConnectToBaidu();
    
    ~HttpConnectToBaidu();
    
    static HttpConnectToBaidu *create();

    void viewDidLoad();

    void httpRequestFinish(CCNode *node,CCObject *_data);
    
    void writeToHTMLFile(const char *fileContent);


};

#endif /* defined(__TestHttpToBaidu__HttpConnectToBaidu__) */

HttpConnectToBaidu.cpp文件


//
//  HttpConnectToBaidu.cpp
//  TestHttpToBaidu
//
//  Created by 江南岸 on 13-3-19.
//
//

#include "HttpConnectToBaidu.h"



HttpConnectToBaidu::HttpConnectToBaidu()
{
    
}

HttpConnectToBaidu::~HttpConnectToBaidu()
{
    
}

HttpConnectToBaidu* HttpConnectToBaidu::create()
{
    HttpConnectToBaidu *http = new HttpConnectToBaidu();
    if(http)
    {
        http->autorelease();
        return http;
    }
    
    CC_SAFE_DELETE(http);
    return NULL;
}

void HttpConnectToBaidu::viewDidLoad()
{
    //獲得CCHttpClient的實例,這裏寫成了單例類
    CCHttpClient *httpClient = CCHttpClient::getInstance();
    
    //new一個CCHttpRequest,創建一個http請求
    CCHttpRequest *request = new CCHttpRequest();
    /*
     
     設置 HttpRequestType ,其中有Get 方式,Post方式,還有一個unknown(沒想到他還給寫錯了,少寫了一個字母n)
     
     typedef enum
     {
     kHttpGet,
     kHttpPost,
     kHttpUnkown,
     } HttpRequestType;
     
     */
    
    //這裏我們用的是Get方式
    request->setRequestType(CCHttpRequest::kHttpGet);
     
    //設置我們想要連接的URl地址,我們這裏想要連接百度,也就是 http://www.baidu.com
    request->setUrl("http://www.baidu.com");
    
    //設置回調函數,這個回調函數是說當服務器響應Get請求後下發的數據
    request->setResponseCallback(this, callfuncND_selector(HttpConnectToBaidu::httpRequestFinish));
    
    //設置tag,我們可以設置一個字符串作爲tag,這個tag我們將在返回數據的response中得到
    request->setTag("Connection_To_Baidu");
    
    //設置響應時間
    httpClient->setTimeoutForConnect(30);
    
    //設置發送數據,當我們與服務器進行交互式,可以把數據放在這裏,基本上都是Post方式向服務器發送數據,這裏我們就不使用了
    //    request->setRequestData("", 0);
    
    
    //好了,請求包我們已經封裝好了,下面我們就把它發送出去
    httpClient->send(request);
    
    //記得把 new 出來的request請求release掉,不可以用autorelease
    request->release();

}

//服務器響應請求之後,返回的數據
void HttpConnectToBaidu::httpRequestFinish(cocos2d::CCNode *node,CCObject *_data)
{
    //把接收到的數據轉換成 CCHttpResponse 類型
    CCHttpResponse *response = (CCHttpResponse*)_data;
    
    //我們首先判斷數據接收是否成功
    if(!response->isSucceed())
    {
        printf("error is here %s",response->getErrorBuffer());
        return;
    }
    
    
    //還記得上面的 request->setTag("Connection_To_Baidu"); 嗎,我們可以在response中得到tag值
    const char* tag = response->getHttpRequest()->getTag();
    if(0 == strcmp(tag, "Connection_To_Baidu"))
    {
        //如果tag值與我們設置的字符串相同的話,就說明這個請求是上面我們寫的
        
        //response->getResponseData() 返回的數據類型是一個向量std::vector<char>類型,我們需要做一些轉換 
        std::vector<char> *data = response->getResponseData();
        
        int vectorLength = data->size();
        if(vectorLength <= 0)
        {
            printf("ResponseData is null");
            return;
        }
        
        //定義一個字符串接收數據
        std::string recieveData;        
        for(int i=0;i<vectorLength;i++)
        {
            recieveData += (*data)[i];
        }
        recieveData += '\0';
        
        printf("recieve data is %s",recieveData.c_str());
        
        writeToHTMLFile(recieveData.c_str());
        
    }
    
    
}

//寫入文件,由於我用的是Xcode,所以這個文件會寫入到iphone模擬器的Library文件夾中
//至於如何找到這個文件夾,請看我的另一篇文章《找到iphone模擬器中的plist文件》
void HttpConnectToBaidu::writeToHTMLFile(const char *fileContent)
{
    //通過cocos2d-x自帶的CCFileUtils類我們可以找到Library下面的Caches文件夾,也就是UserDefault.xml文件夾的位置
    
    std::string filePath = CCFileUtils::sharedFileUtils()->getWriteablePath();
    
    //我們把它寫成一個叫baidu.html的文件
    filePath.append("baidu.html");
    
    FILE *file;
    
    //我們這裏採用的是 wb 的方式,詳情參見下面介紹
    file = fopen(filePath.c_str(), "wb");
    
    /*
     mode有下列幾種形態字符串:
     r 以只讀方式打開文件,該文件必須存在。
     r+ 以可讀寫方式打開文件,該文件必須存在。
     rb+ 讀寫打開一個二進制文件,允許讀數據。
     rw+ 讀寫打開一個文本文件,允許讀和寫。
     w 打開只寫文件,若文件存在則文件長度清爲0,即該文件內容會消失。若文件不存在則建立該文件。
     w+ 打開可讀寫文件,若文件存在則文件長度清爲零,即該文件內容會消失。若文件不存在則建立該文件。
     a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)
     a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾後,即文件原先的內容會被保留。 (原來的EOF符不保留)
     wb 只寫打開或新建一個二進制文件;只允許寫數據。
     wb+ 讀寫打開或建立一個二進制文件,允許讀和寫。
     ab+ 讀寫打開一個二進制文件,允許讀或在文件末追加數據。
     at+ 打開一個叫string的文件,a表示append,就是說寫入處理的時候是接着原來文件已有內容寫入,不是從頭寫入覆蓋掉,t表示打開文件的類型是文本文件,+號表示對文件既可以讀也可以寫。
     */
    
    if(!file)
    {
        printf("open file error !!!  ");
        return;
    }
    
    fwrite(fileContent, 1, strlen(fileContent), file);
    
    //記得關閉文件
    fclose(file);
}

















打開HelloWorldScene.cpp文件,把關閉按鈕的響應事件改成如下代碼,然後運行項目,點擊關閉按鈕,會看到控制檯打出了百度的響應信息,然後找到Library目錄,會看到我們寫入的baidu.html文件

void HelloWorld::menuCloseCallback(CCObject* pSender)
{    
    HttpConnectToBaidu *http = HttpConnectToBaidu::create();
    http->viewDidLoad();

}




看地址欄啊,地址欄可不是www.baidu.com ,而是我們寫入的文件的地址啊



   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章