WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信。实现浏览器与服务器的即时通讯。即服务器也能主动向客户端发消息。

WebSocket代理类和方法:

cocos2d同样对websocket进行了封装。WebSocket和WebSocket::Delegate

1:WebSocket:

   WebSocket类提供了跟websocket相关操作的方法。它的作用包括:

   1、创建socket对象

   2、向服务器发送数据,可以是文本数据,也可以是二进制数据

   3、判断链接状态  

       enum class ErrorCode

       {

               TIME_OUT,

               CONNECTION_FAILURE,

               UNKNOWN,

       };

   等等。

 

2:WebSocket::Delegate:

   类似Socket。WebSocket::Delegate提供了4个纯虚函数,在使用websocket时,需要先继承Delegate类和实现这4个虚函数。

创建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结构体得到数据后,就可以使用这些数据了。


代码实操:

头文件:

#ifndef __TestWebSocketScene_SCENE_H__
#define __TestWebSocketScene_SCENE_H__ #include "cocos2d.h"
#include "network\WebSocket.h"
USING_NS_CC; using namespace cocos2d::network;
class TestWebSocket : public cocos2d::Layer
,WebSocket::Delegate
{
public:
static cocos2d::Scene* createScene();
virtual bool init();
CREATE_FUNC(TestWebSocket); virtual void onOpen(WebSocket *ws);
virtual void onMessage(WebSocket *ws,const WebSocket::Data &data);
virtual void onClose(WebSocket *ws);
virtual void onError(WebSocket *ws,const WebSocket::ErrorCode& error); private:
// 创建对象
WebSocket *wsText;
}; #endif // __TestWebSocketScene_SCENE_H__

源文件:

#include "TestWebSocketScene.h"

Scene* TestWebSocket::createScene()
{
auto scene = Scene::create();
auto layer = TestWebSocket::create();
scene->addChild(layer);
return scene;
} bool TestWebSocket::init()
{
if ( !Layer::init() )
{
return false;
}
Size size = Director::getInstance()->getWinSize();
wsText = nullptr; auto menu = Menu::create();
menu->setPosition(Vec2::ZERO);
addChild(menu); auto lblSendText = Label::create("init websocket","Arial",22);
auto menuSendText = MenuItemLabel::create(lblSendText,[=](Ref *sender){
wsText = new WebSocket();
// 初始化请求地址
if( !wsText->init(*this,"ws://echo.websocket.org")){
// 初始化失败则删除
CC_SAFE_DELETE(wsText);
};
});
menuSendText->setPosition(size/2);
menu->addChild(menuSendText); auto lblSend = Label::create("send","Arial",22);
auto menuSend = MenuItemLabel::create(lblSend,[=](Ref *sender){
if (wsText!=nullptr)
{
// 发送数据
wsText->send("hello websocket.");
}
});
menuSend->setPosition(size.width/2,size.height/2-50);
menu->addChild(menuSend); auto lblSendBinary = Label::create("sent Binary","Arial",22);
auto menuSendBinary = MenuItemLabel::create(lblSendBinary,[=](Ref *sender){
if (wsText!=nullptr)
{
char buffer[] = "hello \0 binary";
wsText->send((unsigned char *)buffer,sizeof(buffer));
}
});
menuSendBinary->setPosition(size.width/2,size.height/2-100);
menu->addChild(menuSendBinary); return true;
} void TestWebSocket::onOpen(WebSocket *ws){
log("webSocket (%p) open",ws);
// webSocket没有http那种tag用于区分不同的请求
// webSocket使用如下方法区分不同请求
if (ws==wsText)
{
log("WebSocket send Text open");
} } void TestWebSocket::onMessage(WebSocket *ws,const WebSocket::Data &data){
log("webSocket (%p) receive message",ws);
if (!data.isBinary)
{//文本数据
log("received message is :%s",data.bytes);
}else//二进制数据的处理
{
std::string result;
for (int i = 0; i < data.len; i++)
{
if (data.bytes[i]!='\0')
{
result +=data.bytes[i];
}else
{
result += "\'\\0\'";
}
}
log("received binary data is: %s",result.c_str());
}
} void TestWebSocket::onClose(WebSocket *ws){
log("webSocket (%p) close",ws);
if (ws==wsText)
{
log("WebSocket send Text close");
}
} void TestWebSocket::onError(WebSocket *ws,const WebSocket::ErrorCode &error){
log("WebSocket (%p) error",ws);
if (ws==wsText)
{
log("WebSocket send Text error");
}
}

Cocos2d-X网络编程(3) Cocos2d中的网络通信协议——WebSocket协议的更多相关文章

  1. [C#网络编程系列]专题一:网络协议简介

    转自:http://www.cnblogs.com/zhili/archive/2012/08/11/NetWorkProgramming.html 因为这段时间都在研究C#网络编程的一些知识, 所以 ...

  2. 【TCP/IP网络编程】:01理解网络编程和套接字

    1.网络编程和套接字 网络编程与C语言中的printf函数和scanf函数以及文件的输入输出类似,本质上也是一种基于I/O的编程方法.之所以这么说,是因为网络编程大多是基于套接字(socket,网络数 ...

  3. Cocos2d-X网络编程(4) Cocos2d中的网络通信协议——Socket通信

    Socket,俗称网络套接字,本身并不是协议,而是一个调用接口,是对TCP/IP协议的封装和应用,.提供了一系列方法方便开发者进行网络通讯. TCP/IP协议是使用最早的通讯协议,它是传输层协议,主要 ...

  4. Cocos2d-X网络编程(2) Cocos2d中的网络通信协议——http协议

    HTTP协议也叫超文本传输协议.是互联网广泛使用的通信协议,常用于B/S架构中. HTTP连接使用的是短连接形式,也就是"请求-响应"的方式,不仅在请求时需要先建立连接,而且需要客 ...

  5. Linux 网络编程基础(1)--网络相关的数据结构及转化函数

    在Linux下进行网络编程,使用的语言一般为C.就个人感受而言,在Linux下进行网络程序的编写,重要的不是代码能力要多强,而是对Linux的网络编程思想的理解和对Linux网络数据结构的掌握.如果想 ...

  6. linux网络编程基础--(转自网络)

    转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接 ...

  7. 网络编程socket,详细讲述osi七层协议

    一 网络编程 源方: 我们首先来说下数据在两台计算机之间的传递:操作系统控制着除应用层以外的四层 对于用户来说我们发数据一般都是在应用层,也就是我们是直接操作应用软件的,那么应用层要把数据传给传输层就 ...

  8. 第三模块:面向对象&网络编程基础 第2章 网络编程

    01-计算机基础 02-什么是网络 03-五层协议详解 04-传输层详解 05-什么是Socket 06-基于socket实现简单套接字通信 07-在简单套接字基础上加上通信循环 08-客户端与服务端 ...

  9. Python网络编程(OSI模型、网络协议、TCP)

    前言: 什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系. 在数学上,网络是一种图,一般认为专指加权图. 网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类 型的实际问题中抽象 ...

随机推荐

  1. [易学易懂系列|rustlang语言|零基础|快速入门|(7)|函数Functions与闭包Closure]

    [易学易懂系列|rustlang语言|零基础|快速入门|(7)函数Functions与闭包Closure] 有意思的基础知识 函数Functions与闭包Closure 我们今天再来看看函数. 在Ru ...

  2. python实例31[生成随即的密码]

    代码: import random import string import time # strong.high = 3  #random for the whole passwd #storng. ...

  3. JavaScript精进篇

    JavaScript是所有前端框架中最基础的框架,在工作了两年以后又重新回到了这里.过去两年里用的最多的前端框架是jquery,因为它简单易上手,而jquery就是封装了JavaScript.重新系统 ...

  4. CodeForces-721D-Maxim and Array(优先队列,贪心,分类讨论)

    链接: https://vjudge.net/problem/CodeForces-721D 题意: Recently Maxim has found an array of n integers, ...

  5. get和post请求的区别?

    ①get请求用来从服务器上获得资源,而post是用来向服务器提交数据: ②get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用“?”连接,而各个变量 ...

  6. layui 获取iframe层的window

    success: function (layero, index) { var iframeWin = $("div.layui-layer-content > iframe" ...

  7. Python 列表(List)Ⅰ

    Python 列表(List) 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型 ...

  8. C#对应JavaScript的银行家舍入规则(Math.Round()对应toFixed(f))

    Math.Round((n * u - t * u )/ u, f);//这里使用银行家四舍五入对应JS的 toFixed() ((n * u - t * u) / u).toFixed(f) f为小 ...

  9. 新建com组件项目步骤

    一.菜单栏  新建->项目->ATL->ATL项目->动态链接库 后续默认完成二.菜单栏  项目->添加类->ATL控件->“写入类的命名如:CeshiMai ...

  10. sqlserver 返回刚插入的那条数据

    insert into xxxxxx(Col_002,UrgentStatus,DoWorkShop,Col_004,Col_005,Col_006,Col_003,Col_007,postQQ,Co ...