博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自动生成proto Js语句
阅读量:6228 次
发布时间:2019-06-21

本文共 2718 字,大约阅读时间需要 9 分钟。

在与后端的WebSocket通信时,前端要带一个proto文件是一个累赘的事情。首先是明显的曝光了协议实体对象,再一个浏览器客户端很容易会缓存该文件,新的协议更新可能导致客户端不能使用,另外在cdn服务器上还需要配置.proto类型客户端才能下载过去。真是遗毒不浅,自己使用的时候会注意这些,但给别人使用的时候就很不乐观了,所以这次全部将proto文件转成JavaScript对象,省去协议文件和加载的步骤。

先看代码:

function createProto(name) {        var args = [].slice.call(arguments, 1);        var obj = new protobuf.Type(name);        for (var i = 0; i < args.length; i++) {            var p = args[i];            var key = i + 1;            obj.add(new protobuf.Field(p[0], key, p[1] || "string"));        }        return obj;    }    function createEnum(name,list) {        var obj = new protobuf.Enum(name);        for (var i = 0; i < list.length; i++) {            obj.add(list[i],i);        }        return obj;    }    function loadProto(callback) {         if (typeof protobuf == "undefined") return;//说明浏览器加载失败            root = new protobuf.Root().define("IMEntity");            root.add(createProto("Token", ["UserID"], ["Token"], ["Device"], ["Version", "int32"], ["Appkey"]));            root.add(createProto("Feedback", ["ResultCode", "int32"], ["ResultData"], ["Seq", "int32"], ["MsgID"]));            root.add(createEnum("ReceiptType", ["Receive", "Read"]));        //...             util.triggerCallback(callback);    };

proto 主要有两种类型,Type和Enum。Type对应协议中的message,相当于是类。Enum就是枚举类型

var Root  = protobuf.Root,    Type  = protobuf.Type,    Field = protobuf.Field;var AwesomeMessage = new Type("AwesomeMessage").add(new Field("awesomeField", 1, "string"));var root = new Root().define("awesomepackage").add(AwesomeMessage);

枚举的创建不要需要Field。只需要add 字段名即可。那么接下来的问题是,手写root.add 也很烦,因为要一个一个对照属性,不断的复制粘贴,很容易出错。所以又做了个自动生成代码的页面:

    

然后页面上会得到:

红色部分复制到工程里面就可以用了。当然要带上createProto和createEnum两个方法。proto的格式要规范,毕竟start里面是以空格split的。相对于protobuf.load("xx.proto",callback)的方式要好很多。load对位置要求比较死板,一定要在根目录。而且有类型不存在就会报错,终止程序。add方法不存在找不到类型的错误。另外速度也快了很多。 

 

转载地址:http://pjnna.baihongyu.com/

你可能感兴趣的文章
python之模块pydoc
查看>>
ASP.NET MVC 下拉列表使用小结
查看>>
nodejs基础 -- NPM 使用介绍
查看>>
Loadrunner中关联的作用:
查看>>
(转)BT1120接口及协议
查看>>
Robot Framework与Web界面自动化测试学习笔记:定位到新窗口
查看>>
The Dataflow Model 论文
查看>>
Linux守护进程
查看>>
遇到没“人性”的管理:你真可怜!
查看>>
http://www.bootcss.com/p/font-awesome/
查看>>
新浪微博UWP UI意见征求
查看>>
使用ServiceStack构建Web服务
查看>>
Linqer工具
查看>>
table中超过长度的列,显示省略号
查看>>
Qtcreator中经常使用快捷键总结
查看>>
可扩展Web架构与分布式系统(转)
查看>>
KVM虚拟机的安装
查看>>
【转】PHP中require和include路径问题总结
查看>>
Android 监听apk安装替换卸载广播
查看>>
指针之——一级二级多级指针
查看>>