Cocos2d-x中的CurlTest深入分析
另:本章所用Cocos2d-x版本为:
Cocos2d-html5-v2.1.1
http://cn.cocos2d-x.org/download
Curl定义:
大家好,今天我们来介绍一下这样一个东西。它叫做Curl,是一套可以访问各种网络协议服务的API,官方网站:http://curl.haxx.se/ .虽然我是第一次遇到它,但是官网上黑体字提醒我:
Possibly more than 500 million users already, I'm sure you canuse it as well!
Cocos2d-x中将curl做为第三方的库加入了进来,它被放在cocos2dx\platform\third_party\win32的curl目录下。
在TestCpp有这样一个演示CurlTest。它简单的应用Curl来访问了一下HTTP服务器。我们来学习一下,打开TestCpp工程下的CurlTest目录。这里有两个文件CurlTest.h/cpp。我们先看一下CurlTest.h:
//演示所用的层。
class CurlTest : public CCLayer
{
public:
//构造
CurlTest();
//析构
~CurlTest();
//当触屏结束时调用
virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
private:
//文字标签
cocos2d::CCLabelTTF* m_pLabel;
};
//演示所用的场景
class CurlTestScene : public TestScene
{
public:
//运行当前场景时调用的函数。
virtual void runThisTest();
};
其对应的CPP:
//加入相应的头文件。
#include "CurlTest.h"
#include "stdio.h"
#include "stdlib.h"
//这里加入了curl库的头文件。
#include "curl/curl.h"
//构造函数。
CurlTest::CurlTest()
{
//取得屏幕大小。
CCSize s = CCDirector::sharedDirector()->getWinSize();
//创建一个文字标签。
CCLabelTTF* label = CCLabelTTF::create("Curl Test", "Arial", 28);
//将标签放入到当前层中。
addChild(label, 0);
//设置位置
label->setPosition( ccp(s.width/2, s.height-50) );
//开启触屏
setTouchEnabled(true);
// 创建用于显示标题的文字标签。
m_pLabel = CCLabelTTF::create("Touch the screen to connect", "Arial", 22);
//设置标签居中显示。
m_pLabel->setPosition(ccp(s.width / 2, s.height / 2));
//将标签放入到当前层中。
addChild(m_pLabel, 0);
//占用它,对其引用计数器加一。
m_pLabel->retain();
}
// 当触屏结束时调用的函数。
void CurlTest::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
//本演示关于CURL使用的语句都放在这里了。
//首先,使用CURL必须要创建一个CULR指针,它是CURL的全局句柄。
CURL *curl;
//这里定义一个CURL库中API的返回值,用于取得API调用的结果。
CURLcode res;
//字符数组,用于存储返回值。
char buffer[10];
//第一步:初始化CURL,取得初始化成功后的CURL指针。
curl = curl_easy_init();
if (curl)
{
//第二步,设定我们用此CURL指针来完成的动作。参数一为CURL指针,参数二为相应的动作类型枚举,这个枚举值在curl.h中定义,比如本例中的CURLOPT_URL,定义为CINIT(URL, OBJECTPOINT, 2),即联接一个网站的HTTP服务。参数三为动作对应的数据参数,这里是网站的URL地址。
curl_easy_setopt(curl, CURLOPT_URL, "www.baidu.com");
//第三步,执行上面设定的动作处理。返回结果放在res中。
res = curl_easy_perform(curl);
//最后一步,清除CURL指针,结束对CURL库的使用。
curl_easy_cleanup(curl);
//如果动作处理成功,则显示联结成功,但没有开始接收任何数据。
if (res == 0)
{
m_pLabel->setString("0 response");
}
else
{
//如果动作处理失败,打印错误码。
sprintf(buffer,"code: %i",res);
m_pLabel->setString(buffer);
}
}
else
{
//如果初始化失败,显示没有CURL
m_pLabel->setString("no curl");
}
}
//析构函数。
CurlTest::~CurlTest()
{
//对占用的标题文本标签计数器减一。不再继续占用以使它能够正常被释放。
m_pLabel->release();
}
//运行当前演示场景调用的函数。
void CurlTestScene::runThisTest()
{
//创建一个演示用的层。
CCLayer* pLayer = new CurlTest();
addChild(pLayer);
//运行当前场景。
CCDirector::sharedDirector()->replaceScene(this);
pLayer->release();
}
我们运行起来,为了更好的显示动作,我打开HTTP Analyzer 来进行消息的捕捉,当我点击屏幕后,HTTP Analyzer会捕捉到相应的HTTP访问记录。如图:
可以看到,本程序向www.baidu.com网站发送了一条GET消息。这只是一个简单的连接过程演示,它完成的很棒。现在我们来点好玩的,比如我想把取得的网页下载下来该如何做呢?
CURL中提供了相应的动作类型来获取数据和写数据到文件。首先我们要先创建一个文件指针,然后通过CURL的动作设置函数来指定用于写文件的文件指针,然后我们创建一个写数据的函数并设置为CURL写数据的回调函数。
//定义的写数据的回调函数。
size_t write_callback(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
return written;
}
//修改触屏结束的函数处理。
void CurlTest::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
CURL *curl;
CURLcode res;
char buffer[10];
curl = curl_easy_init();
if (curl)
{
//创建写入的文件。
FILE *outfile;
outfile = fopen("C:\\baidu.html", "wb");
curl_easy_setopt(curl, CURLOPT_URL, "www.baidu.com");
if(outfile)
{
//指定写入的文件指针。
curl_easy_setopt(curl, CURLOPT_FILE, outfile);
}
//设置写数据的回调函数。
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
//关闭文件
fclose(outfile);
if (res == 0)
{
m_pLabel->setString("0 response");
}
else
{
sprintf(buffer,"code: %i",res);
m_pLabel->setString(buffer);
}
}
else
{
m_pLabel->setString("no curl");
}
}
运行后,我们点击触屏,这里可以发现在C盘下生成一个baidu.html,点开后会是下面的样子:
是不是很有趣呢?CURL更详细的使用方法和各种动作介绍,可以到官网下载Curl的allexamples.zip来研究。里面有很多实例,同时也欢迎到www.game2z.com来与我一起讨论。下课!