微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cocos2dx 网络编程CCHttpRequest和CURL两个方式

转自:http://blog.csdn.net/sg619262284/article/details/20144087

在使用之前需要设置一些参数:参考:http://www.jb51.cc/article/p-ydwlaxpd-tm.html

在完成上面的操作后,还需要在链接器的输入里面添加一个参数pthreadVCE2.lib;


CURL提供了阻塞传输(curl_easy_)和(非阻塞传输)curl_mutl_两种方式。CCHttpClient对CURL进行封装,采用http的方式传输数据。

使用CCHttpRequest方法实现:(异步连接)

  1. voidHallView::Qudian(){//网络异步连接方法
  2. HttpRequest*request=newHttpRequest();
  3. request->setRequestType(HttpRequest::Type::POST);
  4. request->setUrl("www.baidu.com"));
  5. request->setTag(tag);
  6. request->setResponseCallback(this,onHttpRequestCompleted);
  7. request->setRequestData(date,strlen(date));
  8. HttpClient*httpClient=HttpClient::getInstance();
  9. httpClient->setTimeoutForConnect(time);
  10. httpClient->setTimeoutForRead(time);
  11. httpClient->send(request);
  12. request->release();
  13. }

RequestType共有五种模式:kHttpGet、kHttpPost、kHttpPut、kHttpDelete、kHttpUnkown。kHttpUnkown是认的请求模式


添加一个回调方法

  1. voidHallView::onHttpRequestCompleted(cocos2d::CCNode*sender,void*data){
  2. cocos2d::extension::CCHttpResponse*response=(cocos2d::extension::CCHttpResponse*)data;
  3. if(!response){cclOG("Log:response=null,plasecheckit.");return;}
  4. //请求失败
  5. if(!response->isSucceed())
  6. {
  7. this->removeChildByTag(Animate_loading,true);
  8. CCDictionary*pDict=CCDictionary::createWithContentsOfFile("chines.xml");
  9. platform::showMsg(((CCString*)pDict->objectForKey("networking"))->getCString());
  10. cclOG("ERRORBUFFER:%s",response->getErrorBuffer());
  11. return;
  12. }
  13. intcodeIndex=response->getResponseCode();
  14. constchar*tag=response->getHttpRequest()->getTag();
  15. //请求成功
  16. std::vector<char>*buffer=response->getResponseData();
  17. std::stringtemp(buffer->begin(),buffer->end());
  18. CCString*responseData=CCString::create(temp);
  19. Json::Readerreader;//json解析
  20. Json::Valuevalue;//表示一个json格式的对象
  21. if(reader.parse(responseData->getCString(),value))//解析出json放到json中区
  22. {
  23. //这里就可以对返回来的信息做处理
  24. }
  25. }



使用异步连接,程序和联网的方法将互相不干扰,联网方法将为一个独立的线程。


使用CURL方法实现:阻塞式连接

需要加入 头文件#include "curl/curl.h"

  1. voidHallView::denglu(){//登陆游戏
  2. CURL*curl;
  3. CURLcoderes;
  4. stringcc;
  5. curl=curl_easy_init();
  6. if(curl)
  7. {
  8. curl_easy_setopt(curl,CURLOPT_URL,"");//设置请求的地址
  9. curl_easy_setopt(curl,CURLOPT_POST,true);//设置数据类型
  10. stringcaozuo="";
  11. curl_easy_setopt(curl,CURLOPT_POSTFIELDS,caozuo.c_str());//将操作代码,和连接的网站组合,一起发送!
  12. curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1L);
  13. curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,HallView::writehtml);//数据处理回调函数
  14. curl_easy_setopt(curl,CURLOPT_WRITEDATA,&cc);//缓冲的内存
  15. curl_easy_setopt(curl,CURLOPT_TIMEOUT_MS,5000);//设置连接超时时间
  16. res=curl_easy_perform(curl);
  17. if(res!=CURLE_OK)
  18. {
  19. CCDictionary*pDict=CCDictionary::createWithContentsOfFile("chines.xml");
  20. stringmes=((CCString*)pDict->objectForKey("networking"))->getCString();
  21. platform::showMsg(mes);
  22. }
  23. curl_easy_cleanup(curl);
  24. }
  25. else
  26. {
  27. cclog("curlisnull");
  28. }
  29. }


在定义回调函数:这个方法为静态方法,如果里面要引用其他变量,需要为静态变量。
  1. size_tHallView::writehtml(uint8_t*ptr,size_tsize,size_tnumber,void*stream)
  2. {
  3. CCString*a=CCString::createWithFormat("%s",ptr);
  4. std::stringstr1=a->getCString();
  5. Json::Readerreader;//json解析
  6. Json::Valuevalue;//表示一个json格式的对象
  7. if(reader.parse(str1,value))//解析出json放到json中区
  8. {
  9. stringout=value["gameId"].asstring();
  10. gameda->gameId=out;
  11. out=value["newimsI"].asstring();
  12. gameda->newimsI=out;
  13. }
  14. returnsize*number;//这里一定要返回实际返回的字节数
  15. }


在.h中定义:

  1. staticsize_twritehtml(uint8_t*ptr,void*stream);



curl_easy_setopt::属性
curlopt_url//URL地址
curlopt_writefunction//将得到的数据传递相应的函数
curlopt_writeddata//将函数传递给相应的第四个参数里
curlopt_header//如果设置为1,可以返回http头的值;如果设置为非0值,则可以把一个头包含在输出
CURLOPT_TIMEOUT_MS //设置cURL允许执行的最长毫秒数。
curlopt_low_speed_limit//设置一个长整型。控制传送多少字节
curlopt_cookie//传递一个包含httpcookie的头连接
curlopt_flie//传送到输出文件
curlopt_infile//传送过来的输出文件
curlopt_writeheader//输出头部分
curlopt_proxyuserpwd//传递一个形如[username]:[password]格式的字符串去连接http代理
curlopt_postfields//传递一个作为httppost操作的所有数据的字符串
curlopt_referer //在http请求中包含一个referer头的字符串
curlopt_useragent//在http请求中包含一个user-agent 头的字符串
curlpot_ftpport 传递一个包含被ftppost指令使用的IP地址
使用格式curl_easy_setopt( curl,1L); //第一个参数实例化的curl,第二个数属性,第三个为属性
如果,获取的返回值是josn格式,我的博客中有方法非常方便提取指定的值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐