本次采是使用google提供的protoc工具在windows下编译.proto文件,下载地址为https://github.com/protocolbuffers/protobuf/releases,选择适合自己的环境下载即可(可能还需要设置环境变量,如果没有现成的工具,可选择编译源码)
本次所提供的.proto文件,包含Airline.proto、Speed.proto、Location.proto和Datainfo.proto四个,其中Datainfo.proto中嵌套其他三个文件的Message:
按照以下方式执行(cmd和git bash皆可):
红框中的commonjs是为了在nodejs中使用commonjs方式进行使用,编译过后会生成js文件,并且在文件名后加上_pb后缀,例如上图中就会生成Airline_pb.js文件,其中有些关键函数:
SerializeBinary 序列化函数
DeserializeBinary 反序列化函数
一般的步骤是后端将经过序列化的二进制数据发送给前端,前端再反序列化得到实际的数据,除了上述两函数外,还有一些get、set函数等,该插件最后通过以下方式,将proto.pbdata暴露出去,供程序使用:
其他proto文件编译后的情况与上述一致。
前后端采用websocket进行通讯,为了方便测试,直接在ws建立连接时,就发送二进制数据,该数据的通过②所述的插件中set函数设置(有点像设置类中变量),例如:
前端采用H5的webSocket对象建立长连接,这里注意要设置以下接收数据的方式(只需要在client端设置):
如果不设置为arraybuffer,得到的二进制数据为默认的blob类型(还不知blob数据应该怎么使用)。
因为前端需要对接收到的二进制数据进行反序列化,所以要将②中的nodejs插件转化成浏览器可用的js文件,再在html上引用,这里采用browserify(需要npm 全局安装)将commonjs形式的模块转换成浏览器可使用的模块:(函数名和功能不变)
生成的js文件,可直接在html上通过script引用,在ws监听message中进行deserializeBinary反序列化操作:
与服务端设置的一致。
google-protocol与protocol.js的区别:google-protocol生成相应语言的插件进行使用,protocol.js通过直接load需要使用的proto文件,配合一些封装好的函数使用(还有待测试验证)。
原文:https://www.cnblogs.com/Mr-Kahn/p/12728374.html