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. [工具] BurpSuite--XssValidator插件

    0x00 安装 所需软件: 1.burpsuite 2.xssvalidator 源码:https://github.com/nVisium/xssValidator(按照编译指导编译) burpsu ...

  2. 如何使用Beyond Compare比较两个文件夹的差异

    很多时候,我们需要比较两个文件或者两个文件夹的差异性,看看是哪里不同.这时候就需要一款比较软件来处理,Beyond Compare就是其中一款非常好用的版本比较工具,下面简单介绍一下Beyond Co ...

  3. InnoDB和MyISAM的六大区别

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...

  4. c++ primer 5th(中文版)勘误

    \(P_{158}\) "末位大于 3" 改为 "末位大于等于 3" \(P_{302}\) \(P_{319}\) // 添加元素用光多余容量 while ( ...

  5. Eclipse/MyEclipse超全常用快捷键汇总,绝对实用

    [MyEclipse CI 2019.4.0安装包下载] Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 常用快捷 ...

  6. 常用数列总结&性质记录

    1.斐波那契数列 P.S.:这里首项下标为 1 递推式:\[F_i=F_{i-1}+F_{i-2},F_1=F_2=1\] 性质: \(1.\sum^{n}_{i=1}F_{i}=F_{n+2}-1\ ...

  7. 软件的三大类型-单机类型、BS类型、CS类型

    单机类型:最开始的软件就是那些不需要联网的单机软件. CS类型:有的程序需要统一管理软件中使用的数据, 所以就将保存数据的数据库统一存放在一台主机中, 所有的用户在需要数据时都要从主机获取, 这时就分 ...

  8. SQLite为何要用C语言来开发?

    SQLite 选择 C 语言的理由是?为什么不选择 Go 或者 Rust? C 语言是最好的 SQLite 在 2000 年 5 月 29 日发布,并一直使用 C 语言实现.C 语言一直是实现 SQL ...

  9. UVa 11212 Editing a Book (IDA* && 状态空间搜索)

    题意:你有一篇n(2≤n≤9)个自然段组成的文章,希望将它们排列成1,2,…,n.可以用Ctrl+X(剪切)和Ctrl+V(粘贴)快捷键来完成任务.每次可以剪切一段连续的自然段,粘贴时按照顺序粘贴.注 ...

  10. HDU2196computer

    就是求每个点为起始点的最长链的长度. 写一下各个数组的意思吧. f[i][0]为点i向下走最长的距离:f[i][1]为点i向下走第二长的距离: xia[i][0]为点i向下走最长距离所要走的儿子节点: ...