当前位置: 首页 > news >正文

【typescript/flatbuffer】在websocket中使用flatbuffer

目录

  • 说在前面
  • 场景
  • fbs
  • 服务器代码
  • 前端typescript代码
  • 问题

说在前面

  • 操作系统:Windows11
  • node版本:v18.19.0
  • typescript flatbuffer版本:24.3.25

场景

  • 服务器(本文为golang+gin)与前端通信时使用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))
    
http://www.lryc.cn/news/360143.html

相关文章:

  • 构建一个文字冒险游戏:Python 编程实战
  • 09Linux GDB学习笔记
  • 海外金融牌照
  • addEventListener()方法中的几个参数,以及作用
  • FreeRtos进阶——通用链表的实现方式
  • 【kubernetes】关于k8s集群如何将pod调度到指定node节点(亲和与反亲和等)
  • AOP基础
  • EXSI虚拟机新增磁盘并将空间扩充到已有分区
  • 民国漫画杂志《时代漫画》第39期.PDF
  • 每天一个数据分析题(三百四十二)
  • c++会员消费积分系统
  • 如何获知表中数据被删除
  • 机器学习之sklearn基础教程
  • ES升级--04--SpringBoot整合Elasticsearch
  • eclipse如何debug
  • 无人售货机零售业务成功指南:从市场分析到创新策略
  • 开源代码分享(32)-基于改进多目标灰狼算法的冷热电联供型微电网运行优化
  • 7、架构-架构的安全性
  • LeetCode题练习与总结:路径总和Ⅱ--113
  • Java复数计算
  • MySQL-事务日志
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类坐标点QPoint)
  • 算法练习——字符串
  • Flutter 中的 SliverOverlapInjector 小部件:全面指南
  • 7个Python爬虫入门小案例
  • linux 利用 ~$() 构造数字
  • 七大获取免费https的方式
  • JVM(Java虚拟机)笔记
  • 秒杀基本功能开发(显示商品列表和商品详情)
  • centos 记录用户登陆ip和执行命令