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 ,而是我們寫入的文件的地址啊