cocos2dx Http网络编程
转自:http://blog.csdn.net/wangbin_jxust/article/details/9632771,http://blog.csdn.net/wangbin_jxust/article/details/9707873
联网游戏开发中,经常遇到http编程,接下来就分三次对cocos2dx的网络编程进阶。
本博文中先介绍建立基本的http通信并得到返回信息。
1.创建cocos2dx工程。
2.项目引用外部库。
如果要使用cocos2dx的CCHttpClient来进行网络访问,则需要引入cocos2dx的相关库,详细步骤如下:
右键单击项目->属性->c/c++->常规,在右边的附件包含目录中添加cocos2dx的extensions目录对应的路径。

然后,右键单击项目->属性->链接器->输入,在右边的附件依赖项中添加libcurl_imp.lib和libExtensions.lib两个库,用分号隔开。

如果不引入extensions文件夹,会出现找不到CCHttpClient的错误;
如果不引入libcurl_imp.lib和libExtensions.lib两个库,编译项目时也会出现报错。
另外注意引入头文件:
#include "cocos-ext.h"
3.添加下载按钮和回调函数。
CCMenuItemImage *pDownloadItem = CCMenuItemImage::create(
"bt_blue_light.png",
"bt_blue_light.png",
this,
menu_selector(HelloWorld::menuDownloadCallback)
);
CC_BREAK_IF(!pDownloadItem);
CCSize pWinSize = CCDirector::sharedDirector()->getWinSize(); CCMenu* pDownloadMenu = CCMenu::create(pDownloadItem, NULL);
pDownloadMenu->setPosition(ccp( ,));
CC_BREAK_IF(! pDownloadMenu);
this->addChild(pDownloadMenu, );
添加按钮的回调函数:
void HelloWorld::menuDownloadCallback(CCObject* pSender)
{
cocos2d::extension::CCHttpRequest* request = new cocos2d::extension::CCHttpRequest();
request->setUrl("http://www.oschina.net/action/api/news_list");
request->setRequestType(cocos2d::extension::CCHttpRequest::kHttpPost);
std::vector<std::string> headers;
headers.push_back("Content-Type: application/json; charset=utf-8");
request->setHeaders(headers);
const char* postData = "catalog=2&pageIndex=1&pageSize=5";
request->setRequestData(postData ,strlen(postData));
request->setResponseCallback(this, callfuncND_selector(HelloWorld::onHttpRequestCompleted));
request->setTag("Post_My_Data");
cocos2d::extension::CCHttpClient::getInstance()->send(request);
request->release();
}
4.为http request 结束增加回调函数并读取网络数据
void HelloWorld::onHttpRequestCompleted(cocos2d::CCNode *sender ,void *data)
{
AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
cocos2d::extension::CCHttpResponse *response = (cocos2d::extension::CCHttpResponse*)data;
if (!response)
{
return;
}
if ( != strlen(response->getHttpRequest()->getTag()))
{
CCLog("%s completed", response->getHttpRequest()->getTag());
}
int statusCode = response->getResponseCode();
char statusString[] = {};
sprintf(statusString ,"Http status code:%d ,tag = %s" ,statusCode ,response->getHttpRequest()->getTag());
CCLog("response code:%d" ,statusCode);
if (!response->isSucceed())
{
CCLog("response failed");
CCLog("error buffer:%s" ,response->getErrorBuffer());
}
std::vector<char> *buffer = response->getResponseData();
printf("Http response,dump data:");
std::string result = "";
for (unsigned int i = ; i < buffer->size(); i ++)
{
printf("%c" ,(*buffer)[i]);
}
}
debug时就能看到reponse中服务器返回的数据了。
打印到窗体中:

转自:http://blog.csdn.net/sakana87320/article/details/8595242
概述
使用CCHttpClient一般有6步:
- 创建CCHttpRequest实例。
- 设置Url和请求类型。
- 使用CCHttpClient向Url发出请求(连接Url)。
- 读取响应。
- 释放连接。
- 响应处理。
如何使用
获取CCHttpRequest实例
使用一个无参构造方法创建一个CCHttpRequest的实例。CCHttpRequest无参构造方法可以获取一个默认设置的CCHttpRequest实例,该实例可以满足大多数需求。
cocos2d::extension::CCHttpRequest* request = new cocos2d::extension::CCHttpRequest();
设置Url
request->setUrl("blog.csdn.net/sakana87320/article/details/8595242");
设置GET请求
//设置为GET请求:kHttpGet
request->setRequestType(cocos2d::extension::CCHttpRequest::kHttpGet);
//设置处理响应回调函数
request->setResponseCallback(this, callfuncND_selector(HttpClientTest::onHttpRequestCompleted));
request->setTag("GET test");
设置POST请求
//设置为POST请求:kHttpPost
request->setRequestType(cocos2d::extension::CCHttpRequest::kHttpPost);
//设置处理响应回调函数
request->setResponseCallback(this, callfuncND_selector(HttpClientTest::onHttpRequestCompleted));
request->setTag("POST test");
发送请求
cocos2d::extension::CCHttpClient::getInstance()->send(request);
处理返回数据(响应回调函数)
void HttpClientTest::onHttpRequestCompleted(cocos2d::CCNode *sender, void *data)
{
CCHttpResponse *response = (CCHttpResponse*)data;
if (!response)
{
return;
}
// 你可以使用: response->request->reqType获取请求类型
if ( != strlen(response->getHttpRequest()->getTag()))
{
CCLog("%s completed", response->getHttpRequest()->getTag());
}
//获取状态码
int statusCode = response->getResponseCode();
char statusString[] = {};
sprintf(statusString, "HTTP Status Code: %d, tag = %s", statusCode, response->getHttpRequest()->getTag());
m_labelStatusCode->setString(statusString);
CCLog("response code: %d", statusCode);
if (!response->isSucceed())
{
//访问失败获取错误信息
CCLog("response failed");
CCLog("error buffer: %s", response->getErrorBuffer());
return;
}
// 获取返回数据。
std::vector<char> *buffer = response->getResponseData();
printf("Http Test, dump data: ");
for (unsigned int i = ; i < buffer->size(); i++)
{
printf("%c", (*buffer)[i]);
}
printf("\n");
}
释放连接
request->release();
注意
Android平台下不要忘了添加访问网络的权限。
cocos2dx Http网络编程的更多相关文章
- 【独立开发人员er Cocos2d-x实战 013】Cocos2dx 网络编程实战之星座运势
学习cocos2d-x和cocos creator的圈子:cocos2d-x:436689827 cocos creator:124727696 本篇文章主要内容:jsoncpp的使用,Coco ...
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- python select网络编程详细介绍
刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用和select使用,主要用于了解socket通信过程 一.socket模块 socket - Low- ...
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- 猫哥网络编程系列:详解 BAT 面试题
从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...
- 浅谈C#网络编程(一)
阅读目录: 基础 Socket编程 多线程并发 阻塞式同步IO 基础 在现今软件开发中,网络编程是非常重要的一部分,本文简要介绍下网络编程的概念和实践. Socket是一种网络编程接口,它是对传输层T ...
- C++11网络编程
Handy是一个简洁优雅的C++11网络库,适用于linux与Mac平台.十行代码即可完成一个完整的网络服务器. 下面是echo服务器的代码: #include <handy/handy.h&g ...
- Java - 网络编程
Java的网络编程学习,关于计算机基础的学习参考:计算机网络基础学习 - sqh. 参考:
- Linux网络编程-IO复用技术
IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...
随机推荐
- 挺好看的CSS
<?php header("content-type:text/html;charset=utf-8"); echo "<style>h1{ color ...
- 网络加速手段之一,JS文件资源合并下载
有过ftp下载文件经验的人都有体验,单独下载一个100M的文件比分开下载100个1M的文件速度快很多,这是因为下载需要解析域名,建立连接等额外开销的时间,因此下载100个文件就要做100次这种额外的开 ...
- VB6.0编程笔记——(2)开发环境准备&学习前导入
工欲善其事必先利其器,着手开始学习写代码之前,我们需要先准备好需要用到的工具.这篇文章会教大家部署好环境,同时会告知前期我们需要知道的一点内容(可以不用特别理解,只要记住用法就行,后续会深入展开介绍) ...
- nginx upstream的分配方式
1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况. 例 ...
- 横版动作MOBA《超宇宙》首测试玩曝光 详解游戏特色(转)
http://play.163.com/15/0911/11/B37RHHO100314J6L.html
- 苹果将通过新Apple TV打造电视游戏平台 欲发力家庭游戏(转)
据<纽约时报>报道,9月10日凌晨1时举行的苹果发布会上将会公布新版Apple TV设备,还会推出TV版App Store.新设备以游戏作为主要卖点,图形性能将大幅提升. 苹果2015年秋 ...
- motan源码解读:注册中心zookeeper(2)
上文大概讲解了利用zookeeper如何实现注册中心的.本文主要是从源码角度说明下.代码都在模块motan-registry-zookeeper中,其实在在这个模块中就3个类. ZkNodeType: ...
- B-Tree、B+Tree和B*Tree
B-Tree(这儿可不是减号,就是常规意义的BTree) 是一种多路搜索树: 1.定义任意非叶子结点最多只有M个儿子:且M>2: 2.根结点的儿子数为[2, M]: 3.除根结点以外的非叶子结点 ...
- SpringMVC + Spring + MyBatis 学习笔记:在类和方法上都使用RequestMapping如何访问
系统:WIN8.1 数据库:Oracle 11GR2 开发工具:MyEclipse 8.6 框架:Spring3.2.9.SpringMVC3.2.9.MyBatis3.2.8 先看代码: @Requ ...
- JavaScript面向对象(01)--函数
在JavaScript中,函数和对象有区别,也有联系, 首先函数是一个对象,但是和对象存在一些区别如下: 1,不论在java还是js中,如果把一个对象赋值给另一个变量,那么,后者会指向前者对象所在的内 ...