教程目录
一 protobuf简介
二 使用protobuf
三 Demo下载

参考:

CSDN:Egret项目中使用protobuf(protobufjs)

TS项目中使用Protobuf的解决方案(babel)

在cocos creator中使用protobufjs

layabox:网络和格式--ProtocolBuffer

egret protobuf(egret官方提供的工具,自动配置和生成)

protobuf简介
百度百科:protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

参考:protocol buffer_百度百科  中重度游戏开发框架:EGER PRO开发教程
google_protobuf数据类型

使用protobuf
1  导入第三方库
我直接把protobuf第三方库放在了项目中..

修改egretProperties.json文件,增加protobuf库。添加完成后,需要编译引擎。

2 编写protobuf文件
新建一个文件template.proto
我这里编写一个测试用数据,user_login

3 加载protobuf文件

注意类型要是text

4 使用protobuf
读取template_proto文件

[C++] 纯文本查看 复制代码
1
var message = dcodeIO.ProtoBuf.loadProto(RES.getRes("template_proto"));

新建一个user_login类

[AppleScript] 纯文本查看 复制代码
1
2
3
4
var user_login_class = message.build("user_login");
var user_login = new user_login_class();
user_login.userId = 123;
user_login.userName = "peter";

将user_login转成字节

[C#] 纯文本查看 复制代码
1
var bytes = user_login.toArrayBuffer();

socket发送user_login

[C#] 纯文本查看 复制代码
1
2
3
var socket:egret.WebSocket = new egret.WebSocket();
socket.writeBytes(bytes);
socket.flush();

接收数据的处理

//接收服务端数据(假设byteArray是服务端websocket接收数据)
var revData:egret.ByteArray = byteArray; //读取数据
var user_login = user_login_class.decode(revData.buffer);
console.log("接收数据:", user_login);

  

三 Demo下载

其他:

1、怎么自动将.proto文件导出成ts文件?有没有现成工具?

比如一个.proto文件里有

message user_login{
required int32 userId = 1;
required string userName = 2;
} message user_login2{
required int32 userId = 1;
required string userName = 2;
}

怎么导出ts的文件,在egret中直接使用

class user_login{
public userId:number;
public userName:string;
} class user_login2{
public userId:number;
public userName:string;
}

protobufjs工具

准备一个测试用的.proto文件

在安装了nodejs的情况下,全局安装protobufjs。打开cmd窗口,输入:

npm install protobufjs -g

然后在你的proto文件的目录下,打开cmd窗口

输入:

pbjs -t static-module -w commonjs -o template.js template.proto
pbts -o template.d.ts template.js 

 得到如下文件:

仅仅是一些测试数据,但是文件达到了80kb+。生成的template.js里的代码太多了。

生成的文件还有问题。参考:Babel 入门教程

egret官方提供的工具

下载demo瞅瞅,也是封装protobufjs。

dist                                     存放了protobuf-library.js库

egret-project                      白鹭项目

egret-project_wxgame      白鹭小游戏项目

out                                     存放cli.js、index.js,用于拷贝protobuf源码到白鹭项目,添加protobuf到egretProperties.json配置文件中等等

src                                     存放index.ts

.gitignore                           忽略文件

package.json、tsconfig.json    其他等等配置文件

根据教程尝试安装。全局安装protobufjs。

npm install protobufjs@6.8.4 -g
npm install @egret/protobuf -g

在你的白鹭项目下,打开cmd窗口,输入pb-egret add,将代码和项目结构拷贝至白鹭项目中

pb-egret add

譬如我的白鹭项目是TTT

这是会项目目录下会新增一些文件,配置文件也会自动被修改

将测试用的.proto文件放在项目目录TTT\protobuf\protofile下

.proto一定要有package

cmd中输入pb-egret generate,文件将会生成到 protobuf/bundles 文件夹中

pb-egret generate

生成的文件如下。这是.proto文件转成的js库,已经自动配置到egretProperties.json中了。

代码中使用(未实际测试)

        //create user_login
let sendData = new template.user_login();
sendData.userId = 1;
sendData.userName = "abc"; //encode user_login
let sendByte = template.user_login.encode(sendData).finish(); //websocket send
let byteArray:egret.ByteArray = new egret.ByteArray(sendByte);
let socket:egret.WebSocket = new egret.WebSocket();
socket.writeBytes(byteArray);
socket.flush(); //decode user_login
let user_login = template.user_login.decode(sendByte);
console.log(user_login.userId, user_login.userName); //输出1 "abc"

我们打开protobuf-bundles.js,会发现user_login里有有以下方法

create

encode

encodeDelimited

decode

decodeDelimited

fromObject

toObject

toJSON

verify

convert

我们可以对该生成规则进行精简,在生成js文件时,生成指定的方法,减少文件大小

精简生成文件

一、首先修改out文件夹下的index.js

讲generate下的case14修改如下

二、再修改项目protobuf文件夹下的pbconfig.json

修改如下

三、再次打开cmd窗口pb-egret generate生成一次proto文件

会发现create,verify、convert、delimited方法没有了。

四、关于protobuf-bundles.js中的注释,则无需精简,再发布项目时,会自动压缩去掉这些注释。

【咸鱼教程】protobuf在websocket通讯中的使用的更多相关文章

  1. 在网络通讯中应用Protobuf

    在网络通讯中应用Protobuf Protobuf的设计非常适用于在网络通讯中的数据载体,它序列化出来的数据量少再加上以K-V的方式来存储数据,对消息的版本兼容性非常强:还有一个比较大的优点就是有着很 ...

  2. 【咸鱼教程】Base64

    教程目录1 Base64简介2 使用Base643 Demo下载 1 Base64简介百度百科:Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2 ...

  3. 《连载 | 物联网框架ServerSuperIO教程》- 7.自控通讯模式开发及注意事项

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  4. 【node+小程序+web端】简单的websocket通讯

    [node+小程序+web端]简单的websocket通讯 websoket是用来做什么的? 聊天室 消息列表 拼多多 即时通讯,推送, 实时交互 websoket是什么 websocket是一个全新 ...

  5. Flask 实现 WebSocket 通讯---群聊和私聊

    一.WebSocket介绍 WebSocket是一种在单个TCP连接实现了服务端和客户端进行双向文本或二进制数据通信的一种通信的协议. WebSocket使得客户端和服务器之间的数据交换变得更加简单, ...

  6. websocket通讯协议(10版本)简介

    前言: 工作中用到了websocket 协议10版本的,英文的协议请看这里: http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotoc ...

  7. 使用netty实现的tcp通讯中如何实现同步返回

    在netty实现的tcp通讯中,一切都是异步操作,这提高了系统性能,但是,有时候client需要同步等待消息返回,如何实现呢?笔者已经实现,在此总结下重点要素 实现要点: 1.消息结构设计 消息头中需 ...

  8. C# 基于json通讯中的中文的处理

    如果通讯中产生了\\u4e00-\\u9fa5范围的中文的unicode代码,而不是\u4e00-\u9fa5范围的,那么c#的处理就比较麻烦了. 破解方法: 机制 它会把\\u4e00拆成部分来识别 ...

  9. Unity教程之再谈Unity中的优化技术

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体   这一步主要是为了针对性能瓶颈中的”顶点 ...

随机推荐

  1. js 退后一步并刷新,window.history.back(-1);这个只能后退一步不能刷新,

    location.href=document.referrer; document.referrer是获取上一页的url

  2. 按键精灵如何批量复制文本,再往excel里面一次性粘贴?

    原帖地址 http://zhidao.baidu.com/link?url=M2A9E1JF7wAzjtxMQG9uiW_PvP39HVlfwn6zDMzk9m6U05JA37SrgDcrVXg_c9 ...

  3. GetDlgItem的用法小结

    GetDlgItem用于获得指定控件ID的窗体指针,函数原型如下: HWND GetDlgItem( HWND hDlg, int nIDDlgItem ); CWnd* GetDlgItem(int ...

  4. 输入控件tagsinput

    ​摘要: ​tagsinput是一款基于jQuery的插件.具有组织输入内容.校验.backspace删除等功能.当你在输入框输入结束按下enter键,tagsinput会将你输入的内容用标签封装,每 ...

  5. javascript消除字符串两边空格的两种方式,面向对象和函数式编程。python oop在调用时候的优点

    主要是javascript中消除字符串空格,比较两种方式的不同 //面向对象,消除字符串两边空格 String.prototype.trim = function() { return this.re ...

  6. iOS 应用中打开其他应用 (转)

    我们来讨论一下,在iOS开发中,如何实现从app1打开app2. 基本的思路就是,可以为app2定义一个URL,在app1中通过打开这个URL来打开app2,在此过程中,可以传送一些参数.下面来讨论一 ...

  7. Linux查看系统进程

    1. 在 LINUX 命令平台输入 1-2 个字符后按 Tab 键会自动补全后面的部分(前提是要有这个东西,例如在装了 tomcat 的前提下, 输入 tomcat 的 to 按 tab).2. ps ...

  8. ios开发之--MJRefresh上拉加载的时候,tableview会向上偏移

    1,出现这种情况的原因: 这个应该是UITableView最大的改变.我们知道在iOS8引入Self-Sizing之后,我们可以通过实现estimatedRowHeight相关的属性来展示动态的内容, ...

  9. MSF 内网渗透笔记

    进入meterpreter模式 在meterpreter中输入shell即可进入CMD窗口接着即可执行CMD命令,例如打开RDP服务REG ADD HKLM\SYSTEM\CurrentControl ...

  10. iOS开发-为UITableViewCell添加横线

    在开发过程中经常会遇到设计稿中Cell分割线样式和系统自带的样式差别很大,如何实现这里做下总结,主要包括如下两步: 1. 取消TableView默认的分割线样式 _tableView.separato ...