Cocos2d-x中的CurlTest深入分析

长平狐 发布于 2013/03/19 18:39
阅读 411
收藏 0

[Cocos2d-x相关教程来源于红孩儿的游戏编程之路CSDN博客地址:http://blog.csdn.net/honghaier

红孩儿Cocos2d-X学习园地QQ3群:205100149

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:

//演示所用的层。
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来与我一起讨论。下课!




原文链接:http://blog.csdn.net/honghaier/article/details/8686517
加载中
返回顶部
顶部