Cocos2d-x 网络编程
主要介绍内容:Http协议,Socket协议,webSocket协议, Cocos2d-x中的相关类和方法
1 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();
获取请求返回的数据:
getResponceState
获取返回状态,返回值是一个整数,200表示请求成功,400表示服务器错误,404表示服务器上找不到相应的文件。
issucced() ,用来判断是否返回成功
2 WebSocket协议
WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信。实现浏览器与服务器的即时通讯。
WebSocket:
WebSocket类提供了跟websocket相关操作的方法。它的作用包括:
1、创建socket对象
2、向服务器发送数据,可以是文本数据,也可以是二进制数据
3、判断链接状态
enum class ErrorCode
{
TIME_OUT,
CONNECTION_FAILURE,
UNKNOWN,
};
等等。
WebSocket::Delegate:
类似Socket。WebSocket::Delegate提供了4个纯虚函数,在使用websocket时,需要先继承Delegate类和实现这4个虚函数。
1、virtual void onOpen(WebSocket* ws) ;
当打开websocket连接时调用
2、virtual void onMessage(WebSocket* ws, const Data& data) ;
当接收到数据时调用
3、virtual void onClose(WebSocket* ws) ;
当关闭连接时调用
4、virtual void onError(WebSocket* ws, const ErrorCode& error) ;
当发送数据但没有建立连接,或者是收到断开连接的信号时调用。
如何创建WebSocket对象并发送文本数据?
创建对象:
cocos2d::network::WebSocket* wsSendText = new network::WebSocket()
初始化请求地址:
wsSendText ->init(*this, "ws://echo.websocket.org")。
发送数据:
wsSendText ->send("Hello WebSocket, I'm a text message.");
如何接受数据并发送二进制数据
当服务器向客户端发送数据,客户端会调用onMessage方法接收返回的数据。
数据使用WebSocket::Data封装。它是cocos2d定义的一个结构体。结果如下:
struct Data
{
Data():bytes(nullptr), len(0), issued(0), isBinary(false){}
char* bytes;
ssize_t len, issued;
bool isBinary;
};
它包含四个字段:bytes存放数据,len存放数据的长度,isBinary用来标识bytes中存放的数据是文本数据还是二进制数据。
使用Data结构体得到数据后,就可以使用这些数据了。
3 Socket通讯
Socket,俗称网络套接字,本身并不是协议,而是一个调用接口,是对TCP/IP协议的封装和应用,。提供了一系列方法方便开发者进行网络通讯。
TCP/IP协议是使用最早的通讯协议,它是传输层协议,主要解决数据如何在网络中传输。
Socket中又分为流模式与数据报模式,即TCP与UDP两种方式。
TCP : Transmission Control Protocol,传输控制协议,是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,但也是最安全的。
UDP : User Data Protocol,用户数据报协议。传输数据之前源端和终端不建立连接,发送端直接把数据发送到网络,接收端把消息段放在队列中,应用程序每次从队列中读一个消息段。
3.1 Socket基础和通信流程
Socket几个定义:
1)IP地址:即依照TCP/IP协议分配给本地主机的网络地址,两个进程要通讯,任一进程首先要知道通讯对方的位置,即对方的IP。
2)端口号:用来辨别本地通讯进程,一个本地的进程在通讯时均会占用一个端口号,不同的进程端口号不同,因此在通讯前必须要分配一个没有被访问的端口号。
3)连接:指两个进程间的通讯链路。
客户/服务器模式:
在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器(Client/Server, C/S)模式,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。
Socket通信流程:
服务端:
1、服务器端先初始化Socket
2、当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名。bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地半相关
3、对端口进行监听(listen)
4、调用accept阻塞,等待客户端连接。
客户端:
1、客户端初始化一个Socket
2、然后连接服务器(connect)
3、如果连接成功,这时客户端与服务器端的连接就建立了。
4、客户端发送数据请求(send),服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据。
5、最后关闭连接,一次交互结束。
3.2 SocketIO,SIODelegate和SIOClient
类似http,cocos2d对socket也进行了封装。提供了SocketIO,SIODelegate和SIOClient三个类。
SocketIO:connet
使用单例模式,初始化Socket,获取SIOClient。
SIODelegate:
使用Socket协议,首先要继承SIODelegate,并且还要实现SIODelegate的4个虚函数
// 当打开socket连接时会调用这个函数
virtual void onConnect(cocos2d::network::SIOClient* client);
// 当接收到数据时会调用这个函数
virtual void onMessage(cocos2d::network::SIOClient* client, const std::string& data);
// 当socket关闭时,会调用这个函数
virtual void onClose(cocos2d::network::SIOClient* client);
// 当连接错误或接收到错误信号时会调用这个函数
virtual void onError(cocos2d::network::SIOClient* client, const std::string& data);
SIOClient:
处理Socket的一系列动作,比如,发送数据,监听事件,断开连接等
Cocos2d-x 网络编程的更多相关文章
- cocos2dx Http网络编程
转自:http://blog.csdn.net/wangbin_jxust/article/details/9632771,http://blog.csdn.net/wangbin_jxust/art ...
- 【独立开发人员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中,提 ...
随机推荐
- ADO.NET异步操作测试
配置文件: <?xml version="1.0"?> <configuration> <startup> <supportedRunti ...
- AI探索(一)基础知识储备
AI的定义 凡是通过机器学习,实现机器替代人力的技术,就是AI.机器学习是什么呢?机器学习是由AI科学家研发的算法模型,通过数据灌输,学习数据中的规律并总结,即模型内自动生成能表达(输入.输出)数据之 ...
- vue项目打包注意的地方
打包有两种方式: 第一种方式:1.更改config文件夹下prod.env.js下的地址: 2.将config文件夹下index.js中build下改为 assetsPublicPath: '', 第 ...
- EF ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象
今天编码过程中遇到这个问题,用EF 更新数据库,将组织好的数据传递到ef的上下文中,本以为附加上去更新,一切就ok了,不过事实证明没这么顺利 ----------------------------- ...
- 从jQuery学细节
前言 最近看了两遍jQuery源码,感觉只是看懂了jQuery的小部分小部分,不过仅此,就已经对john resig佩服的五体投地咯.. 下面附上这位帅哥的靓照,记住吧,是他改变了世界. 看的大多是实 ...
- uva11054 - Wine trading in Gergovia(等价转换,贪心法)
这个题看上去麻烦,实际上只要想清楚就很简单.关键是要有一种等价转换的思维方式.其实题意就是个一排数,最后通过相邻的互相移动加减使得所有数都变成零,移动过程中每次都耗费相应值,让耗费的值最小.虽然从实际 ...
- CI框架后台添加左侧导航栏出现的一系列问题
- Java垃圾回收机制——finallize()
其实了解JAVA的人,都知道JAVA的GC机制是其的一大优点,它令程序员不需要主动去考虑内存溢出和垃圾回收的问题,不像c++具有显式的析构函数对整个对象进行内存清理以及需要调用delete才可以进行显 ...
- 使用python实现两个文件夹里文件的对比(包含内容的对比)
#-*-coding:utf-8-*- #=============================================================================== ...
- python3 之logging模块
logging.getLogger(name=None)Return a logger with the specified name or, if name is None, return a lo ...