Cocos2d-x中的CurlTest深入分析
Cocos2d-x中的CurlTest深入分析
另:本章所用Cocos2d-x版本为:
Cocos2d-html5-v2.1.1
http://cn.cocos2d-x.org/download
Curl定义:
curl is a command line tool fortransferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, Gopher,HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP,SMTP, SMTPS, Telnet and TFTP. curl supports SSL certificates, HTTP POST, HTTPPUT, FTP uploading, HTTP form based upload, proxies, cookies, user+passwordauthentication (Basic, Digest, NTLM, Negotiate, kerberos...), file transferresume, proxy tunneling and a busload of other useful tricks.
大家好,今天我们来介绍一下这样一个东西。它叫做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:
[cpp]
//演示所用的层。
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:
[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();
}
补充:移动开发 , 其他 ,