cocos2dx 网络编程(CCHttpRequest和CURL两个方式)
2014-02-28 16:41
435 查看
在使用之前需要设置一些参数:参考:/article/1350350.html
在完成上面的操作后,还需要在链接器的输入里面添加一个参数pthreadVCE2.lib;
CURL提供了阻塞传输(curl_easy_)和(非阻塞传输)curl_mutl_两种方式。CCHttpClient对CURL进行封装,采用http的方式传输数据。
使用CCHttpRequest方法实现:(异步连接)
RequestType共有五种模式:kHttpGet、kHttpPost、kHttpPut、kHttpDelete、kHttpUnkown。kHttpUnkown是默认的请求模式
添加一个回调方法。
使用异步连接,程序和联网的方法将互相不干扰,联网方法将为一个独立的线程。
使用CURL方法实现:阻塞式连接
需要加入 头文件#include "curl/curl.h"
在定义回调函数:这个方法为静态方法,如果里面要引用其他变量,需要为静态变量。
在.h中定义:
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, CURLOPT_FOLLOWLOCATION, 1L); //第一个参数实例化的curl,第二个数属性,第三个为属性值
如果,获取的返回值是josn格式,我的博客中有方法非常方便提取指定的值。
在完成上面的操作后,还需要在链接器的输入里面添加一个参数pthreadVCE2.lib;
CURL提供了阻塞传输(curl_easy_)和(非阻塞传输)curl_mutl_两种方式。CCHttpClient对CURL进行封装,采用http的方式传输数据。
使用CCHttpRequest方法实现:(异步连接)
void HallView::Qudian(){//网络异步连接方法 HttpRequest* request = new HttpRequest(); request->setRequestType(HttpRequest::Type::POST); request->setUrl("www.baidu.com")); request->setTag(tag); request->setResponseCallback(this,onHttpRequestCompleted); request->setRequestData(date, strlen(date)); HttpClient* httpClient=HttpClient::getInstance(); httpClient->setTimeoutForConnect(time); httpClient->setTimeoutForRead(time); httpClient->send(request); request->release(); }
RequestType共有五种模式:kHttpGet、kHttpPost、kHttpPut、kHttpDelete、kHttpUnkown。kHttpUnkown是默认的请求模式
添加一个回调方法。
void HallView::onHttpRequestCompleted(cocos2d::CCNode *sender ,void *data){ cocos2d::extension::CCHttpResponse* response=(cocos2d::extension::CCHttpResponse*)data; if(!response) {CCLOG("Log:response =null,plase check it."); return;} //请求失败 if(!response->isSucceed()) { this->removeChildByTag(Animate_loading,true); CCDictionary* pDict = CCDictionary::createWithContentsOfFile("chines.xml"); platform::showMsg(((CCString*)pDict->objectForKey("networking"))->getCString()); CCLOG("ERROR BUFFER:%s",response->getErrorBuffer()); return; } int codeIndex=response->getResponseCode(); const char* tag=response->getHttpRequest()->getTag(); //请求成功 std::vector<char>* buffer=response->getResponseData(); std::string temp(buffer->begin(),buffer->end()); CCString* responseData=CCString::create(temp); Json::Reader reader;//json解析 Json::Value value;//表示一个json格式的对象 if(reader.parse(responseData->getCString(),value))//解析出json放到json中区 { //这里就可以对返回来的信息做处理 } }
使用异步连接,程序和联网的方法将互相不干扰,联网方法将为一个独立的线程。
使用CURL方法实现:阻塞式连接
需要加入 头文件#include "curl/curl.h"
void HallView::denglu(){ //登陆游戏 CURL *curl; CURLcode res; string cc; curl=curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, ""); //设置请求的地址 curl_easy_setopt(curl, CURLOPT_POST, true); //设置数据类型 string caozuo=""; curl_easy_setopt(curl, CURLOPT_POSTFIELDS,caozuo.c_str()); //将操作代码,和连接的网站组合,一起发送! curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,HallView::writehtml); //数据处理回调函数 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &cc);//缓冲的内存 curl_easy_setopt(curl,CURLOPT_TIMEOUT_MS,5000); //设置连接超时时间 res=curl_easy_perform(curl); if(res!=CURLE_OK) { CCDictionary* pDict = CCDictionary::createWithContentsOfFile("chines.xml"); string mes=((CCString*)pDict->objectForKey("networking"))->getCString(); platform::showMsg(mes); } curl_easy_cleanup(curl); } else { CCLog("curl is null"); } }
在定义回调函数:这个方法为静态方法,如果里面要引用其他变量,需要为静态变量。
size_t HallView::writehtml(uint8_t* ptr,size_t size,size_t number,void *stream) { CCString* a=CCString::createWithFormat("%s",ptr); std::string str1=a->getCString(); Json::Reader reader;//json解析 Json::Value value;//表示一个json格式的对象 if(reader.parse(str1,value))//解析出json放到json中区 { string out=value["gameId"].asString(); gameda->gameId=out; out=value["newIMSI"].asString(); gameda->newIMSI=out; } return size*number;//这里一定要返回实际返回的字节数 }
在.h中定义:
static size_t writehtml(uint8_t* ptr,size_t size,size_t number,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, CURLOPT_FOLLOWLOCATION, 1L); //第一个参数实例化的curl,第二个数属性,第三个为属性值
如果,获取的返回值是josn格式,我的博客中有方法非常方便提取指定的值。
相关文章推荐
- cocos2dx 网络编程(CCHttpRequest和CURL两个方式)
- cocos2dx 网络编程(CCHttpRequest和CURL两个方式)
- cocos2dx 网络编程(CCHttpRequest和CURL两个方式)
- cocos2dx学习笔记(CCHttpRequest和CURL两个方式)
- cocos2dx 网络编程(CCHttpRequest和CURL两个方式)
- cocos2dx 网络编程(CCHttpRequest和CURL两个方式)
- CCHTTPRequestAndroid() 与 curl处理方式不同的问题
- 在spring中获得HttpServletRequest 的三种方式
- HttpServletRequest setCharacterEncoding 接收post方式传递的中文参数
- cocos2dx CCHttpRequest里面的内存引用计数的故事
- java-springmvc4-几种获取 HttpServletRequest 对象的方式
- RestKit 和 ASIHTTPRequest 两个框架相比较,有哪些异同?
- CCHttpRequest不能做队列加载?
- socket,curl,file_get_content三种HTTP模拟表单提交的方式
- Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作模式。
- curl 以http方式读取文件并保存
- C#网页采集数据的几种方式(WebClient、WebBrowser和HttpWebRequest/HttpWebResponse)
- 用ASIHTTPRequest 的block方式请求数据
- 通过XMLHttpRequest和jQuery实现ajax的几种方式
- COCOS2D-X之CCHttpRequest下载图片Demo