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


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

    在使用之前需要设置一些参数:参考:http://blog.csdn.net/wangbin_jxust/article/details/9632771

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

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

    void HallView::Qudian()
    {
       //网络异步连接方法 cocos2d::extension::CCHttpRequest* postRequest=new cocos2d::extension::CCHttpRequest(); postRequest->setRequestType(cocos2d::extension::CCHttpRequest::kHttpPost);//设置发送类型 postRequest->setUrl("");//设置网址 postRequest->setResponseCallback(this,callfuncND_selector(HallView::onHttpRequestCompleted));//回调函数,处理接收到的信息 string caozuo=""; CCString *data=CCString::stringWithString(caozuo); postRequest->setRequestData(data->getCString(),data->length());//这里的代码会接在网络地址后面,一起发送。 cocos2d::extension::CCHttpClient* httpClient=cocos2d::extension::CCHttpClient::getInstance(); httpClient->setTimeoutForConnect(10);<span style="font-family: Arial, Helvetica, sans-serif;">//设置连接超时时间</span> httpClient->setTimeoutForRead(10);//设置发送超时时间 httpClient->send(postRequest);//设置接收数据类型 postRequest->release();//释放 }

    添加一个回调方法。

    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格式,我的博客中有方法非常方便提取指定的值。

  • 相关阅读:
    最短路径问题/Spfa
    cddiv/数组维护
    cfdiv2/c/找规律
    Codeforces Round #343 (Div. 2)【A,B水题】
    POJ 2135_Farm Tour
    POJ 3469_Dual Core CPU
    POJ 3469_Dual Core CPU
    POJ 3281_Dining
    POJ 3281_Dining
    POJ 3041_Asteroids
  • 原文地址:https://www.cnblogs.com/sevenyuan/p/3897625.html
Copyright © 2020-2023  润新知