protocol buffer——nodejs中的实践

本次采是使用google提供的protoc工具在windows下编译.proto文件,下载地址为https://github.com/protocolbuffers/protobuf/releases,选择适合自己的环境下载即可(可能还需要设置环境变量,如果没有现成的工具,可选择编译源码)

编写.proto文件

本次所提供的.proto文件,包含Airline.proto、Speed.proto、Location.proto和Datainfo.proto四个,其中Datainfo.proto中嵌套其他三个文件的Message:

使用protoc.exe编译proto文件

按照以下方式执行(cmd和git bash皆可):

红框中的commonjs是为了在nodejs中使用commonjs方式进行使用,编译过后会生成js文件,并且在文件名后加上_pb后缀,例如上图中就会生成Airline_pb.js文件,其中有些关键函数:

SerializeBinary 序列化函数

DeserializeBinary 反序列化函数

一般的步骤是后端将经过序列化的二进制数据发送给前端,前端再反序列化得到实际的数据,除了上述两函数外,还有一些get、set函数等,该插件最后通过以下方式,将proto.pbdata暴露出去,供程序使用:

其他proto文件编译后的情况与上述一致。

编写后端websocket服务

前后端采用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文件,配合一些封装好的函数使用(还有待测试验证)。

猜你喜欢

转载自www.cnblogs.com/Mr-Kahn/p/12728374.html