cocos2dx 3.2 Http网络连接,curl 库的介绍
cocos2dx HTTP网络连接简介cocos2dx中HTTP网络连接部分主要使用了curl开源库。curl是一个跨平台的库,它可以模拟浏览器请求,模拟表单数据,上传下载,支持ftp和https,功能很强大,具体帮助信息可以通过curl的官网获取,http://curl.haxx.se/。它一般在php和C++中使用比较广泛。从官网下载下来的curl库,可以编译成工具,直接使用命令行方式运行,也可使用库文件在代码中调用。 cocos2dx中访问http网络有两种方式,一种就是直接使用curl库,自己构造相关参数,但前提是需要对curl使用方法有一定了解。还有一种就是使用HttpClient类,它是引擎基于curl为我们封装的一个类,使用起来比较方便,多线程,安全。两种方式区别在于HttpClient是异步的,而使用curl可以是同步的,也可以写成异步的,并且比较灵活,也可以应对比较复杂的网络请求。但一般情况下,建议直接使用HttpClient。 下面简单介绍一下curl的几个重要函数,知道了这几个函数的意义,使用起来就方便很多。使用时需要包含#include curl/curl.h curl函数1, CURLcode curl_global_init(long flags); 描述:从字面意思来看已经知道,这个函数只能调用一次。在模块的初始化函数中调用。 2, void curl_global_cleanup(void); 3, char*curl_version( ); 4 ,CURL*curl_easy_init( ); 5,void curl_easy_cleanup(CURL*handle);
CURLoption这个参数可以查找相应的头文件就可以知道curl支持哪些功能。 7 ,CURLcode curl_easy_perform(CURL*handle); cocos2dx中使用curl示例程序以下程序简单的访问了google.com网址,并设置了超时时间和在屏幕上显示服务器返回信息。 class CurlTest : public Layer { public: CurlTest(); ~CurlTest(); virtual void ccTouchesEnded(cocos2d::CCSet *pTouches,cocos2d::CCEvent *pEvent); private: cocos2d::CCLabelTTF* m_pLabel; }; CurlTest::CurlTest() { CCLabelTTF* label = CCLabelTTF::create("Curl Test","Arial",28); addChild(label,0); label->setPosition( ccp(VisibleRect::center().x,VisibleRect::top().y-50) ); setTouchEnabled(true); // create a label to display the tip string m_pLabel = CCLabelTTF::create("Touch the screen to connect",22); m_pLabel->setPosition(VisibleRect::center()); addChild(m_pLabel,0); m_pLabel->retain(); curl_global_init(CURL_GLOBAL_ALL); } void CurlTest::ccTouchesEnded(CCSet *pTouches,CCEvent *pEvent) { CURL *curl; CURLcode res; char buffer[10]; curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl,CURLOPT_URL,"google.com"); curl_easy_setopt(curl,CURLOPT_VERBOSE,TRUE); curl_easy_setopt(curl,CURLOPT_TIMEOUT,10); res = curl_easy_perform(curl); /* always cleanup */ curl_easy_cleanup(curl); if (res == 0) { m_pLabel->setString("0 response"); } else { sprintf(buffer,"code: %i",res); m_pLabel->setString(buffer); } } else { m_pLabel->setString("no curl"); } } HttpClient接口使用HttpClient比较简单,首先构造一个HttpRequest类,设置请求的url,请求类型等。HttpClient是一个单例,调用其send方法,把请求发送出去。然后在HttpRequest中设置的回调函数中获取HttpResponse对象即可。 如下示例程序取自引擎自带的示例函数: <span style="white-space:pre"> </span>HttpRequest* request = new HttpRequest(); // required fields request->setUrl("http://httpbin.org/ip"); request->setRequestType(HttpRequest::Type::GET); request->setResponseCallback(CC_CALLBACK_2(HttpClientTest::onHttpRequestCompleted,this)); if (isImmediate) { request->setTag("GET immediate test2"); HttpClient::getInstance()->sendImmediate(request); }else { request->setTag("GET test2"); HttpClient::getInstance()->send(request); } // don't forget to release it,pair to new request->release(); void HttpClientTest::onHttpRequestCompleted(HttpClient *sender,HttpResponse *response) { if (!response) { return; } // You can get original request type from: response->request->reqType if (0 != strlen(response->getHttpRequest()->getTag())) { log("%s completed",response->getHttpRequest()->getTag()); } long statusCode = response->getResponseCode(); char statusString[64] = {}; sprintf(statusString,"HTTP Status Code: %ld,tag = %s",statusCode,response->getHttpRequest()->getTag()); _labelStatusCode->setString(statusString); log("response code: %ld",statusCode); if (!response->isSucceed()) { log("response failed"); log("error buffer: %s",response->getErrorBuffer()); return; } // dump data std::vector<char> *buffer = response->getResponseData(); printf("Http Test,dump data: "); for (unsigned int i = 0; i < buffer->size(); i++) { printf("%c",(*buffer)[i]); } printf("n"); if (response->getHttpRequest()->getReferenceCount() != 2) { log("request ref count not 2,is %d",response->getHttpRequest()->getReferenceCount()); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |