cocos2dx中 curl

来源:互联网 发布:java socket服务端程序 编辑:程序博客网 时间:2024/05/22 13:01

               Cocos2d-x中将curl做为第三方的库加入了进来,它被放在cocos2dx\platform\third_party\win32的curl目录下。

 

                    在TestCpp有这样一个演示CurlTest。它简单的应用Curl来访问了一下HTTP服务器。我们来学习一下,打开TestCpp工程下的CurlTest目录。这里有两个文件CurlTest.h/cpp。我们先看一下CurlTest.h:

[cpp] view plaincopy
  1. //演示所用的层。  
  2. class CurlTest : public CCLayer  
  3. {  
  4. public:  
  5.     //构造  
  6.     CurlTest();  
  7.     //析构  
  8.     ~CurlTest();  
  9.     //当触屏结束时调用  
  10.     virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);  
  11.   
  12. private:  
  13.     //文字标签  
  14.     cocos2d::CCLabelTTF*         m_pLabel;  
  15. };  
  16.   
  17. //演示所用的场景  
  18. class CurlTestScene : public TestScene  
  19. {  
  20. public:  
  21.     //运行当前场景时调用的函数。  
  22.     virtual void runThisTest();  
  23. };  

其对应的CPP:

[cpp] view plaincopy
  1. //加入相应的头文件。  
  2. #include "CurlTest.h"  
  3. #include "stdio.h"  
  4. #include "stdlib.h"  
  5. //这里加入了curl库的头文件。  
  6. #include "curl/curl.h"  
  7. //构造函数。  
  8. CurlTest::CurlTest()  
  9. {  
  10.     //取得屏幕大小。  
  11.     CCSize s = CCDirector::sharedDirector()->getWinSize();  
  12.     //创建一个文字标签。  
  13.     CCLabelTTF* label = CCLabelTTF::create("Curl Test""Arial", 28);  
  14.     //将标签放入到当前层中。  
  15.     addChild(label, 0);  
  16.     //设置位置  
  17.     label->setPosition( ccp(s.width/2, s.height-50) );  
  18.     //开启触屏  
  19.     setTouchEnabled(true);  
  20.   
  21.     // 创建用于显示标题的文字标签。  
  22.     m_pLabel = CCLabelTTF::create("Touch the screen to connect""Arial", 22);  
  23.     //设置标签居中显示。  
  24.     m_pLabel->setPosition(ccp(s.width / 2, s.height / 2));  
  25.     //将标签放入到当前层中。  
  26.     addChild(m_pLabel, 0);  
  27.     //占用它,对其引用计数器加一。  
  28.     m_pLabel->retain();  
  29. }  
  30.   
  31.   
  32. // 当触屏结束时调用的函数。  
  33. void CurlTest::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)  
  34. {  
  35.     //本演示关于CURL使用的语句都放在这里了。  
  36.     //首先,使用CURL必须要创建一个CULR指针,它是CURL的全局句柄。  
  37.     CURL *curl;  
  38.     //这里定义一个CURL库中API的返回值,用于取得API调用的结果。  
  39.     CURLcode res;  
  40.     //字符数组,用于存储返回值。  
  41.     char buffer[10];  
  42.     //第一步:初始化CURL,取得初始化成功后的CURL指针。  
  43.     curl = curl_easy_init();  
  44.     if (curl)   
  45.     {  
  46.         //第二步,设定我们用此CURL指针来完成的动作。参数一为CURL指针,参数二为相应的动作类型枚举,这个枚举值在curl.h中定义,比如本例中的CURLOPT_URL,定义为CINIT(URL,  OBJECTPOINT, 2),即联接一个网站的HTTP服务。参数三为动作对应的数据参数,这里是网站的URL地址。  
  47.         curl_easy_setopt(curl, CURLOPT_URL, "www.baidu.com");  
  48.         //第三步,执行上面设定的动作处理。返回结果放在res中。  
  49.         res = curl_easy_perform(curl);  
  50.        //最后一步,清除CURL指针,结束对CURL库的使用。  
  51.         curl_easy_cleanup(curl);  
  52.         //如果动作处理成功,则显示联结成功,但没有开始接收任何数据。  
  53.         if (res == 0)  
  54.         {  
  55.             m_pLabel->setString("0 response");  
  56.         }  
  57.         else  
  58.         {  
  59.               //如果动作处理失败,打印错误码。  
  60.             sprintf(buffer,"code: %i",res);  
  61.             m_pLabel->setString(buffer);  
  62.         }  
  63.     }   
  64.     else   
  65.     {  
  66.        //如果初始化失败,显示没有CURL  
  67.        m_pLabel->setString("no curl");  
  68.     }   
  69. }  
  70. //析构函数。  
  71. CurlTest::~CurlTest()  
  72. {  
  73.     //对占用的标题文本标签计数器减一。不再继续占用以使它能够正常被释放。  
  74.     m_pLabel->release();  
  75. }  
  76.   
  77. //运行当前演示场景调用的函数。  
  78. void CurlTestScene::runThisTest()  
  79. {  
  80.     //创建一个演示用的层。  
  81.     CCLayer* pLayer = new CurlTest();  
  82.     addChild(pLayer);  
  83.     //运行当前场景。  
  84.     CCDirector::sharedDirector()->replaceScene(this);  
  85.     pLayer->release();  
  86. }  


                    我们运行起来,为了更好的显示动作,我打开HTTP Analyzer 来进行消息的捕捉,当我点击屏幕后,HTTP Analyzer会捕捉到相应的HTTP访问记录。如图:




 

                    可以看到,本程序向www.baidu.com网站发送了一条GET消息。这只是一个简单的连接过程演示,它完成的很棒。现在我们来点好玩的,比如我想把取得的网页下载下来该如何做呢?

                    CURL中提供了相应的动作类型来获取数据和写数据到文件。首先我们要先创建一个文件指针,然后通过CURL的动作设置函数来指定用于写文件的文件指针,然后我们创建一个写数据的函数并设置为CURL写数据的回调函数。

[cpp] view plaincopy
  1. //定义的写数据的回调函数。  
  2. size_t write_callback(void *ptr, size_t size, size_t nmemb, FILE *stream)  
  3. {  
  4.     size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);  
  5.     return written;  
  6. }  
  7.   
  8.   
  9. //修改触屏结束的函数处理。  
  10. void CurlTest::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)  
  11. {  
  12.     CURL *curl;  
  13.     CURLcode res;  
  14.     char buffer[10];      
  15.     curl = curl_easy_init();  
  16.     if (curl)   
  17. {  
  18.         //创建写入的文件。  
  19.         FILE *outfile;  
  20.         outfile = fopen("C:\\baidu.html""wb");  
  21.   
  22.         curl_easy_setopt(curl, CURLOPT_URL, "www.baidu.com");  
  23.         if(outfile)  
  24.         {  
  25.             //指定写入的文件指针。  
  26.             curl_easy_setopt(curl, CURLOPT_FILE, outfile);  
  27.         }  
  28.         //设置写数据的回调函数。  
  29.         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);  
  30.         res = curl_easy_perform(curl);  
  31.         curl_easy_cleanup(curl);  
  32.         //关闭文件  
  33.         fclose(outfile);  
  34.         if (res == 0)  
  35.         {  
  36.   
  37.             m_pLabel->setString("0 response");  
  38.         }  
  39.         else  
  40.         {  
  41.             sprintf(buffer,"code: %i",res);  
  42.             m_pLabel->setString(buffer);  
  43.         }  
  44.     }   
  45.     else   
  46.     {  
  47.         m_pLabel->setString("no curl");  
  48.     }   
  49.   
  50. }  

 

                    运行后,我们点击触屏,这里可以发现在C盘下生成一个baidu.html,点开后会是下面的样子:



                    是不是很有趣呢?CURL更详细的使用方法和各种动作介绍,可以到官网下载Curl的allexamples.zip来研究。里面有很多实例,同时也欢迎到www.game2z.com来与我一起讨论。下课!


0 0