Cocos2d-X网络编程(3) Cocos2d中的网络通信协议——WebSocket协议
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协议的更多相关文章
- [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网络编程(2) Cocos2d中的网络通信协议——http协议
HTTP协议也叫超文本传输协议.是互联网广泛使用的通信协议,常用于B/S架构中. HTTP连接使用的是短连接形式,也就是"请求-响应"的方式,不仅在请求时需要先建立连接,而且需要客 ...
- 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)
前言: 什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系. 在数学上,网络是一种图,一般认为专指加权图. 网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类 型的实际问题中抽象 ...
随机推荐
- Vue基础第一章
Vue的简单示例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- 如何在Linux下安装JDK1.8
本文会详细介绍如何在Linux下安装JDK1.8 首先要设置虚拟机的IP地址,不知道如何设置的话可以 翻看我的前一篇博客 http://www.cnblogs.com/xiaoxiaoSMILE/ ...
- jquery预览本地图片
本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...
- gdb命令小结
GDB命令小结 gdb <filename> : 调试指定程序文件 r : run 的简写,运行被调试程序, 如果此前没有下过断点,则执行完整个程序:如果有断点, 则程序暂停在第一个可用断 ...
- h5页面弹窗时页面固定(弹窗下面的页面不滑动)
页面出现弹窗时,底部页面不能随之滑动怎么解决? 只需将页面的body增加一个样式 overflow:hidden;就能解决 jq: //开启弹窗 $('body').attr('style','ove ...
- 用Chrome 浏览器调试移动端网页 chrome://inspect/#devices
谷歌输入(chrome://inspect/#devices) 我使用的是小米(红米NOTE2 ),电脑是win 10 系统,以下几步就可以轻松使用浏览器内置的功能调试移动端网页了: 1. 手机开启调 ...
- scipy.sparse 稀疏矩阵
from 博客园(华夏35度)http://www.cnblogs.com/zhangchaoyang 作者:Orisun 本文主要围绕scipy中的稀疏矩阵展开,也会介绍几种scipy之外的稀疏矩阵 ...
- python 关于字节串和字符串
import pickle s=pickle.dumps(clf) f=open('svm.txt','wb') #使用二进制方式打开,write进字节,否则进字符 f.write(s) f.clos ...
- JavaScript 中的 for 循环---------------引用
在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 下面先来看看大家最常见的一种写法: 当数组长度在循环过程中不会改变时,我们应将 ...
- Olympic Game
每次奥运会期间,大家都非常关注奖牌榜排名的情况. 现在我们假设奖牌榜的排名规则,按优先级从高到低如下: 金牌 数量多的排在前面: 银牌 数量多的排在前面: 铜牌 数量多的排在前面: 若以上三个条件仍无 ...