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

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

时间: 2024-09-30 11:49:25

cocos2dx 网络编程(CCHttpRequest和CURL两个方式)的相关文章

【独立开发人员er Cocos2d-x实战 013】Cocos2dx 网络编程实战之星座运势

学习cocos2d-x和cocos creator的圈子:cocos2d-x:436689827    cocos creator:124727696 本篇文章主要内容:jsoncpp的使用,Cocos2dx网络编程,聚合数据星座运势接口使用. 1.jsoncpp使用: jsoncpp的生成请參考博客:Jsoncpp使用具体解释以及链接问题解决 2.聚合数据星座运势接口使用: 我们先登上聚合数据官网.申请相关的数据后,就能够得到APPKEY等信息,调试例如以下: 3.Cocos2dx网络编程:源

【独立开发者er Cocos2d-x实战 013】Cocos2dx 网络编程实战之星座运势

本篇文章主要内容:jsoncpp的使用,Cocos2dx网络编程,聚合数据星座运势接口使用. 1.jsoncpp使用: jsoncpp的生成请参考博客:Jsoncpp使用详解以及链接问题解决 2.聚合数据星座运势接口使用: 我们先登上聚合数据官网,申请相关的数据后,就可以得到APPKEY等信息,调试如下: 3.Cocos2dx网络编程:源码下载请点击(源码中包括jsoncpp文件) #include "HelloWorldScene.h" #include "CocoStud

cocos2d-x网络编程 连接php服务器笔记1

学习cocos2d-x网络编程是一个非常尴尬的问题,因为熟悉cocos2d-x的学习者基本在游戏开发一块属于客户端编程,想自学网络编程必不可少的牵扯到服务器这块.但是问题是,谁会呢?离开服务器,那搞网络编程无疑就是海市蜃楼镜花水月.官网示例虽然有http短连接和socket长连接的例子但反正我看了之后不知所以,不明白怎么把它用在实际问题中.网上教程也大都是泛泛而谈,不是一些人尽皆知的大道理就是部分不能运行的源码,根本就没有从零教你怎么实现的文章.手游服务器用的技术我们不大可能很了解,据说长连接的

PHP socket网络编程之使用curl

PHPsocket 网络编程之使用cURL cURl代表客户端URL,是一种专门处理URL的命令行工具.本文介绍cURl打开网页并向其提交数据. [示例]:cURL库被PHP用于向页面传递数据 <?PHP //创建cURL事务 $url = 'HTTP://localhost/service.php'; $curl = curl_init($url); //如果发生错误,直接运行失败 curl_setopt($curl,CURLOPT_FAILONERROR,1); //支持重定向 curl_s

cocos2d-x网络编程 连接php服务器笔记4

VS工程部分----网络编程 本节会把最终实现代码和资源放在文章最未提供各位下载学习. 本节我们开始重头戏联网功能的开发,我用的是cocos2d-x绑定的curl库,这个curl据说很火,虽然我本人了解的不多只晓得基本用法,让大家见笑了.好了想用这个库还是要在工程里设置下的,如开头要包含头文件 #include "curl/curl.h" (官方写法) 这样写需要工程属性 -> 链接器->附加库目录里加上curl路径,假如你跟我一样觉不明所以干脆写全:#include &q

Cocos2d-x 网络编程

主要介绍内容:Http协议,Socket协议,webSocket协议, Cocos2d-x中的相关类和方法 1 Http协议 HTTP协议也叫超文本传输协议.是互联网广泛使用的通信协议,常用于B/S架构中.HTTP连接使用的是短连接形式,也就是"请求-响应"的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据. HTTP常用的有2种数据提交方式,分别是GET.POST. 1)get是从服务器上获取(查询)数据,post是向服务器传送数据: 2) g

cocos2d-x网络编程 连接php服务器笔记3

上节服务器部分已经开发完,本节开始客户端部分开发,首先是UI制作. UI制作 既然是登录验证那当然要有登录界面,UI起码也要像个游戏样子吧这里我不想用基本控件,就用cocostudio制作一个吧,cocostudio里有一个标准的登录界面如下: 为了图省事我用最新版的Cocos制作的(v2.2.8)当然你直接用cocostudio1.6导出json文件也可以,但是没有这样方便.如果你第一次使用,想用它来建立VS2012的 C++工程需要先在商店里下载一个Cocos Framework v3.6.

cocos2d-x网络编程

在这里我整理了以往自已用的一些关于HTTP和Socket编程资料,当然也有一些自已对网络编程的理解 首先说说HTTP与Socket概念性的一些认识: Socket通常称为“套接字”,用于描述IP地址和端口. 套接字类型分为: 1>,流式套接字:提供面向连接,可靠的数据传输服务,数据无差错,无重复的发送,且按顺序接收,基于TCP协议 2>,数据报式套接字:提供无连接服务,数据以独立形式发关,不提供无错保证,接必顺序混乱,基于UDP协议 Socket是对TCP/IP协议的封装和应用,它本身并不是协

Java 网络编程(二) 两类传输协议:TCP UDP

两类传输协议:TCP,UDP TCP TCP是Transfer Control Protocol(传输控制协议)的简称,是一种面向连接的保证可靠传输的协议. 在TCP/IP协议中, IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一确定Internet上的一台主机. 而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的. 通过TCP协议传输,得到的是一个顺序的无差错的数据流. 发送方和接收方的成对的两个socket之间