做网站域名备案需要多久,网络运营商ip地址,用户体验设计师,二级建造师执业资格考试目录 说在前面场景fbs服务器代码前端typescript代码问题 说在前面 操作系统#xff1a;Windows11node版本#xff1a;v18.19.0typescript flatbuffer版本#xff1a;24.3.25 场景
服务器(本文为golanggin)与前端通信时使用flatbuffer进行序列化与反序列化通信协议为websock… 目录 说在前面场景fbs服务器代码前端typescript代码问题 说在前面 操作系统Windows11node版本v18.19.0typescript flatbuffer版本24.3.25 场景
服务器(本文为golanggin)与前端通信时使用flatbuffer进行序列化与反序列化通信协议为websocket
fbs 测试使用的flatbuffer schema如下 namespace fbs;enum Command:int32 {None 0,Mesh 1,PhysXml 2,
}table MsgWebsocket {cmd: Command;data: [ubyte];
}相对比较简单唯一复杂的地方在于使用了一个byte数组 获取flatc 在github release页面下载对应版本的二进制程序这里下载了windows版本的 解压后得到flatc.exe 生成golang代码 bin\flatc.exe -g ws.fbs
# bin\flatc.exe -g -o ..\ ws.fbs
# -o 制定生成目录 生成typescript代码 bin\flatc.exe --ts ws.fbs 服务器代码
反序列化前端发来的数据func handleFbMsg(p []byte, ws *websocket.Conn) {// GetRootAsMsgWebsocket为生成的函数用于解析二进制数据msg : fbs.GetRootAsMsgWebsocket(p, 0)switch msg.Cmd() {case fbs.CommandMesh:mesh, err : os.ReadFile(./a.bin)if err nil {ws.WriteMessage(websocket.BinaryMessage, buildByteFbMsg(msg.Cmd(), mesh))} else {fmt.Println(err)}case fbs.CommandPhysXml:}
}序列化要发给前端的数据func buildByteFbMsg(cmd fbs.Command, b []byte) []byte {builder : flatbuffers.NewBuilder(len(b) 4)off : builder.CreateByteVector(b)// startfbs.MsgWebsocketStart(builder)fbs.MsgWebsocketAddCmd(builder, cmd)fbs.MsgWebsocketAddData(builder, off)// endend : fbs.MsgWebsocketEnd(builder)builder.Finish(end)nb : builder.FinishedBytes()return nb
}flatbuffer的序列化过程比较复杂具体的例子可以参考官方文档
前端typescript代码
反序列化代码和后端类似private handleSceneMsg(data: any) {var buffer new ByteBuffer(new Uint8Array(data.data))var msg MsgWebsocket.getRootAsMsgWebsocket(buffer)switch (msg.cmd()) {case Command.Mesh:breakcase Command.PhysXml:break}
}序列化public ok(cmd: Command) {const builder new flatbuffers.Builder(0)MsgWebsocket.startMsgWebsocket(builder)MsgWebsocket.addCmd(builder, cmd)const end MsgWebsocket.endMsgWebsocket(builder)builder.finish(end)const data builder.asUint8Array()this._socket.send(data)
}问题
如何序列化 参考官方文档说实在的fb的序列化是目前见过最麻烦的了其他大部分都是一个函数搞定前端反序列化出错var buffer new ByteBuffer(data.data)最开始是这行代码data是websocket的事件data.data实际上是arraybuffer需要转换一下var buffer new ByteBuffer(new Uint8Array(data.data))