Cocos2d-X网络编程(2) Cocos2d中的网络通信协议——http协议
HTTP协议也叫超文本传输协议。是互联网广泛使用的通信协议,常用于B/S架构中。
HTTP连接使用的是短连接形式,也就是“请求-响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
HTTP常用的有2种数据提交方式,分别是GET、POST
1:get是从服务器上获取(查询)数据,post是向服务器传送数据;
2:get传送的数据量较小,不能大于2KB,post传送的数据量较大,一般认为不受限;
3:get安全性非常低;post安全性相对来说就比较好了;
Cocos2d-x封装了3个类来处理HTTP请求,HttpRequest、HttpClient和HttpResponse。它们在命名空间cocos2d::network中定义,所以使用时要先声明该命名空间。
请求过程:
1. 创建 HttpRequest 的实例;
2. 设置请求方式,GET、POST等。
3. 设置请求地址和发送的数据;
4. 设置响应回调函数,在回调函数中处理获取的数据;
5. 创建HttpClient实例,发送请求;
6. 释放连接。
一:HttpRequest
是一种数据类型,它提供了一些方法用来定义或获取HTTP请求的参数。常用方法包括下面几种。
设置请求连接:void setUrl(const char * url);
设置请求类型:void setRequestType(Type type)
Type是Cocos2d-x定义的一个枚举类型,包括5种类型。
enum class Type
{
GET,
POST,
PUT,
DELETE,
UNKNOWN,
};
设置回调函数:void setResponseCallback(Ref * pTarget,SEL_HttpResponse pSelector )
设置请求的数据,参数buffer是提交的数据,len是请求数据的长度:void setRequestData(const char* buffer, unsigned int len);
二:HttpClient
用来控制请求相关的参数,比如发送请求,设置请求超时时间。它使用单例模型。这一模式的目的是使得类的一个对象成为系统中的唯一实例。cocos2d中多处用到这一模型。
比如Director对象,创建Director::getInstance()。
又比如,音频处理对象: SimpleAudioEngine::getInstance();
常用方法:
发送请求:send(HttpRequest* request)
设置连接超时时间:setTimeoutForConnect(int value)
三:HttpResponse
包含服务器返回的数据等信息。使用HttpResponse提供的方法可以获取这些数据。
常用方法:
获取请求返回的数据:std::vector<char>* getResponseData();
获取返回状态:getResponceCode 返回值是一个整数,200表示请求成功,400表示服务器错误,404表示服务器上找不到相应的文件。
issucced():用来判断是否返回成功
在发送请求的时候可能一次不止发送一条请求,那么怎么区分呢?可以在发送请求时设置tag,在响应中接收tag,判断,然后执行后续操作。
设置请求头:setHeaders
Content-Type:内容类型。用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。如果未指定 ContentType,默认为TEXT/HTML。
charset:编码格式
设置格式: Content-Type: application/json; charset=utf-8
sendImmediate和send的区别:使用send,按顺序发送请求,使用sendImmediate,立即发送
代码实操:
头文件:
#ifndef __TestHttp_SCENE_H__
#define __TestHttp_SCENE_H__
#include "cocos2d.h"
#include "network\HttpRequest.h"
#include "network\HttpClient.h"
#include "network\HttpResponse.h"
USING_NS_CC;
using namespace cocos2d::network;
class TestHttp : public cocos2d::Layer
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
void menuCloseCallback(cocos2d::Ref* pSender);
CREATE_FUNC(TestHttp);
// 发送请求后收到响应的回调函数
void complete(HttpClient *client,HttpResponse *response);
};
#endif // __TestHttp_SCENE_H__
源文件:
#include "TestHttpScene.h"
#include "curl\include\win32\curl\curl.h"
Scene* TestHttp::createScene()
{
auto scene = Scene::create();
auto layer = TestHttp::create();
scene->addChild(layer);
return scene;
}
bool TestHttp::init()
{
if ( !Layer::init() )
{
return false;
}
// GET方式
// 一 1:创建 HttpRequest 的实例
auto getReq = new HttpRequest();
// 一 2:设置请求地址
getReq->setUrl("http://httpbin.org/ip");
getReq->setTag("type get");
// 一 3:设置请求类型 get
getReq->setRequestType(HttpRequest::Type::GET);
// 一 4:设置请求的数据
char data[50] = "data";
getReq->setRequestData(data,strlen(data));
// 一 5:设置服务器响应回调函数
getReq->setResponseCallback(CC_CALLBACK_2(TestHttp::complete,this));
// 二 1:创建HttpClinet对象
auto client = HttpClient::getInstance();
// 二 2:设置超时时间
client->setTimeoutForConnect(60);
// 二 2:设置读取时间(可设可不设)
client->setTimeoutForRead(100);
// 二 3:发送请求
client->send(getReq);
// 二 4:释放请求
getReq->release();
// POST方式
auto postReq = new HttpRequest();
// 设置标记,用于区分不同请求
postReq->setTag("type post");
postReq->setUrl("http://httpbin.org/post");
postReq->setRequestType(HttpRequest::Type::POST);
// 设置请求头(内容类型和编码方式)
std::vector<std::string> header;
header.push_back("Content-Type:application/json;charset=utf-8");
postReq->setHeaders(header);
const char* reqData = "controller=cocos2d&action=testHttpPost";
postReq->setRequestData(reqData,strlen(reqData));
postReq->setResponseCallback(CC_CALLBACK_2(TestHttp::complete,this));
auto client2 = HttpClient::getInstance();
client2->sendImmediate(postReq);
postReq->release();
return true;
}
// 服务器响应回调函数
void TestHttp::complete(HttpClient *client,HttpResponse *response)
{
// 获取请求的tag
log("request tag is:%s",response->getHttpRequest()->getTag());
// 获取响应状态
log("response code is:%d",response->getResponseCode());
if(response->isSucceed()) // 返回成功
{
/*std::vector<char> * data = response->getResponseData();
log("response data is:");
for (int i = 0; i < data->size(); i++)
{
log("%c",(*data)[i]);
}*/
std::vector<char> * data = response->getResponseData();
std::stringstream oss;
for (int i = 0; i < data->size(); i++)
{
oss<<(*data)[i];
}
std::string str = oss.str();
log("response data is:%s",str.c_str());
}else // 失败,打印错误信息
{
log("error msg is:%s",response->getErrorBuffer());
}
}
Cocos2d-X网络编程(2) Cocos2d中的网络通信协议——http协议的更多相关文章
- [C#网络编程系列]专题一:网络协议简介
转自:http://www.cnblogs.com/zhili/archive/2012/08/11/NetWorkProgramming.html 因为这段时间都在研究C#网络编程的一些知识, 所以 ...
- 【TCP/IP网络编程】:01理解网络编程和套接字
1.网络编程和套接字 网络编程与C语言中的printf函数和scanf函数以及文件的输入输出类似,本质上也是一种基于I/O的编程方法.之所以这么说,是因为网络编程大多是基于套接字(socket,网络数 ...
- Cocos2d-X网络编程(4) Cocos2d中的网络通信协议——Socket通信
Socket,俗称网络套接字,本身并不是协议,而是一个调用接口,是对TCP/IP协议的封装和应用,.提供了一系列方法方便开发者进行网络通讯. TCP/IP协议是使用最早的通讯协议,它是传输层协议,主要 ...
- Cocos2d-X网络编程(3) Cocos2d中的网络通信协议——WebSocket协议
WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信.实现浏览器与服务器的即时通讯.即服务器也能主动向客户端发消息. WebSocket代理类和方法: co ...
- Linux 网络编程基础(1)--网络相关的数据结构及转化函数
在Linux下进行网络编程,使用的语言一般为C.就个人感受而言,在Linux下进行网络程序的编写,重要的不是代码能力要多强,而是对Linux的网络编程思想的理解和对Linux网络数据结构的掌握.如果想 ...
- linux网络编程基础--(转自网络)
转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接 ...
- 网络编程socket,详细讲述osi七层协议
一 网络编程 源方: 我们首先来说下数据在两台计算机之间的传递:操作系统控制着除应用层以外的四层 对于用户来说我们发数据一般都是在应用层,也就是我们是直接操作应用软件的,那么应用层要把数据传给传输层就 ...
- 第三模块:面向对象&网络编程基础 第2章 网络编程
01-计算机基础 02-什么是网络 03-五层协议详解 04-传输层详解 05-什么是Socket 06-基于socket实现简单套接字通信 07-在简单套接字基础上加上通信循环 08-客户端与服务端 ...
- Python网络编程(OSI模型、网络协议、TCP)
前言: 什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系. 在数学上,网络是一种图,一般认为专指加权图. 网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类 型的实际问题中抽象 ...
随机推荐
- java课堂作业3 第一题 能查阅申请对象个数
实验代码 public class Num { public static void main(String[] args) { // TODO Auto-generated method stub ...
- 【LuoguP5289】[十二省联考2019] 皮配
题目链接 题目描述 略 Sol 一道背包问题 首先暴力做法设 \(dp[i][j][k]\) 表示前 \(i\) 个城市的学校被分到第一阵营 \(j\) 人 第一门派 \(k\) 人的方案数. 中间一 ...
- 【SpringBoot】spring-session-data-redis 解决集群环境下session共享
为什么会产生Session共享问题 集群情况下,session保存在各自的服务器的tomcat中,当分发地址至不同服务时,导致sesson取不到,就会产生session共享问题. 解决方案 负载均 ...
- 【NOIP2016提高A组模拟10.15】最大化
题目 分析 枚举两个纵坐标i.j,接着表示枚举区域的上下边界, 设对于每个横坐标区域的前缀和和为\(s_l\),枚举k, 显然当\(s_k>s_l\)时,以(i,k)为左上角,(j,k)为右下角 ...
- 转 弹性反向传播(RProp)和均方根反向传播(RMSProp)
from http://blog.csdn.net/tsq292978891/article/details/78619384 都是一种权值更新算法,类似于SGD算法,其中,RMSProp是RProp ...
- 【leetcode】1202. Smallest String With Swaps
题目如下: You are given a string s, and an array of pairs of indices in the string pairs where pairs[i] ...
- 015:URLs分层模块化
URLs分层模块化: 经过上面的14节课程,大伙有没有发现一个问题:那就是随着的项目功能模块越来越多,所有url匹配都写在一个urls.py文件中,其结果是:文件长,看着心累——需要分门别类:因此能不 ...
- postman—创建collection,执行collection和批量执行
接口测试中,可以在 Postman 逐个创建请求.但当请求逐渐增多时,如果我们不采取任何措施管理,散乱的请求维护起来就比较麻烦了.这个时候我们可以创建测试集 Collection 来对这些请求进行管理 ...
- 由于数据库 'XXX' 离线,无法打开该数据库。
大家使用sql server 进行还原的时候可能会遇到: system.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权 这个错误 下面是有一个解决 ...
- npm 安装与卸载模块
1. 只卸载模块 由于之前安装过,在 package.json 中的记录仍然存在 npm uninstall lodash 2. --save 参数使用 卸载模块的同时删除在 package.json ...