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中,提 ...
随机推荐
- Sublime2 + SASS + Koala 测试
Sublime SASS语法高亮插件下载地址:https://github.com/kuroir/SCSS.tmbundle/zipball/SublimeText2 koala_2.0.4_setu ...
- 强大的表格控件handsometable,结合vue
handsontable handsontable是目前在前端界最接近excel的插件,可以执行编辑,复制粘贴,插入删除行列,排序等复杂操作.jQuery.react.ng和vue版本,功能强大,是复 ...
- nyoj-3-多边形重心问题(求多边形面积和中心)
题目链接 /* Name:nyoj-3-多边形重心问题 Copyright: Author: Date: 2018/4/26 21:25:41 Description: ACM国际大学生程序设计竞赛 ...
- Codeforces Round #258 (Div. 2)C(暴力枚举)
就枚举四种情况,哪种能行就是yes了.很简单,关键是写法,我写的又丑又长...看了zhanyl的写法顿时心生敬佩.写的干净利落,简直美如画...这是功力的体现! 以下是zhanyl的写法,转载在此以供 ...
- Linux 下如何调试 Python?
一般开发者都是在 IDE 中进行程序的调试,当然,有 IDE 的话,当然首选 IDE 进行调试. 但是,有时我们的业务场景,限制只能在 Linux 命令行模式进行调试. 这时该怎么办呢? 今天,就给大 ...
- docker容器与宿主机之间内容拷贝
来自:http://blog.csdn.net/yangzhenping/article/details/43667785 常用的方式有3种: 从容器内拷贝文件到主机上 docker cp <c ...
- bzoj 3709: [PA2014]Bohater 贪心
题目: 在一款电脑游戏中,你需要打败\(n\)只怪物(从\(1\)到\(n\)编号).为了打败第\(i\)只怪物,你需要消耗\(d_i\)点生命值,但怪物死后会掉落血药,使你恢复\(a_i\)点生命值 ...
- Vue 将样式绑定到一个对象让模板更清晰
Vue 将样式绑定到一个对象让模板更清晰 <div id="app"> <div v-bind:style="styleObject"> ...
- 修改分区后的 Grub rescue
声明:这里用到的知识不是原创,综合了几篇教程的成果.找的时候比较混乱,所以来源已经不确定.希望原作者见谅. 系统是Windows 8.1 和 Ubuntu 14.04, Windows是先装的, gr ...
- git之切换分支出现的问题
当在其他分支,如test分支开发的时候,新增了文件夹等目录结构.开发完成后,切换会master分支. 如果出现“Deletion of directory '***' failed. Should I ...