前端项目对接protobufjs的时候,踩坑总结

Protobuf(Protocol Buffers)是一种用于序列化结构化数据的语言无关、平台无关、可扩展的机制。在JS/TS项目中,使用WebSocket与Protobuf可以实现高效的通信和数据传输。protobufjs官方仓库:https://github.com/protobufjs/protobuf.js

安装protobuf.js依赖

安装protobuf.js依赖的时候,如果你使用的cnpm源或者不是npm官方源的话,可能会报错说找不到这个依赖,需要更换为官方的npm源然后安装:https://xiaoshen.blog.csdn.net/article/details/135767569

定义proto文件

我在本地定义了一个简单的proto文件:person.proto

syntax = "proto3";
package example;message person {int32 id = 1;string name = 2;
}message person_list {repeated person Per = 1;
}

编译proto文件报错问题

编译的时候,需要使用es6模式的,不能使用commonjs,不然会报:

pnpm pbjs -t static-module -w es6 -o src/proto/person.js src/proto/person.proto

错误的编译命令:

pnpm pbjs -t static-module -w commonjs -o  src/proto/person.js src/proto/person.proto

Uncaught SyntaxError: The requested module does not provide an export named

WebSocket发送Protobuf消息

将WebSocket和Protobuf结合起来使用,可以实现高效的通信和数据传输。在发送消息时,可以先将消息对象序列化成二进制数据,然后再通过WebSocket发送:

binaryType说明:WebSocket.binaryType - Web API 接口参考 | MDN

const ws = new WebSocket('ws://192.168.1.171:8989/echo');
// 必须加上,不然解析出来的数据为空
ws.binaryType = "arraybuffer"

在接收消息时,可以先将接收到的二进制数据反序列化成消息对象,然后再进行处理:

不然会报错:protobufjs_minimal.js?v=b54c0ab3:1044 Uncaught Error: illegal buffer

ws.onmessage = function (event) {console.log('Received: ' + event.data);// 必须使用Uint8Array解析数据,不然解析不出来const res = protoRoot.example.all_person.decode(new Uint8Array(event.data));console.log("解码后的内容:", res);count.value = res;};

通过结合WebSocket和Protobuf,可以实现更高效、更可靠的数据传输,提升JS/TS项目的性能和开发效率。 

我本地的写的完整代码:

<script setup lang="ts">
import { onMounted, ref } from 'vue'
import protoRoot from "@/proto/person.js"const count: any = ref()
const ws = new WebSocket('ws://192.168.1.171:8989/echo');
// 必须加上,不然解析出来的数据为空
ws.binaryType = "arraybuffer"
// 接收到消息时的处理逻辑
ws.onmessage = (event) => {count.value = event.data;
}
// 发送消息
ws.onopen = () => {ws.send('Hello, server!');
}ws.onmessage = function (event) {console.log('Received: ' + event.data);// 必须使用Uint8Array解析数据,不然解析不出来const res = protoRoot.example.person_list.decode(new Uint8Array(event.data));console.log("解码后的内容:", res);count.value = res;
};ws.onclose = function (event) {console.log('WebSocket connection closed', event);
};// 页面初始化
onMounted(() => {console.log("组件加载:", protoRoot);
})</script><template><div><div>wbsocket消息:</div><div>{{ count }}</div></div>
</template><style scoped>
.logo {height: 6em;padding: 1.5em;will-change: filter;transition: filter 300ms;
}.logo:hover {filter: drop-shadow(0 0 2em #646cffaa);
}.logo.vue:hover {filter: drop-shadow(0 0 2em #42b883aa);
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/427253.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能之数据科学库sklearn

引言 当我初次接触数据分析三剑客&#xff08;numpy、pandas、matplotlib&#xff09;时&#xff0c;感觉每个库的功能都很多很杂&#xff0c;所以在差不多理清了各模块功能后便相继推出了各自教程&#xff08;文末附链接&#xff09;&#xff1b;后来&#xff0c;当接触了机器…

怎么给wordpress网站底部页脚添加备案号和链接?

以前“WordPress后台 >> 常规”最底部是有一个ICP备案号的&#xff0c;我们只需要填写备案号并保存更改即可让WordPress自带主题底部显示ICP备案号&#xff0c;但是现在新版本的WordPress已经没有了这个ICP备案号选项&#xff0c;而且也无法直接添加公安联网备案号&#…

关于网络模型的笔记

1. OSI 七层参考模型&#xff1a; 简介&#xff1a; 七层模型&#xff0c;亦称 OSI&#xff08;Open System Interconnection&#xff09;参考模型&#xff0c;即开放式系统互联。参考模型 是国际标准化组织&#xff08;ISO&#xff09;制定的一个用于计算机或通信系统间互联…

条件语句及if语句,case语句

文章目录 条件语句一、测试1、概述格式 2、文件测试2.1 格式2.2 常用操作符 3、比较整数数值3.1 格式3.2 常用操作符 4、字符串比较4.1 格式4.2 常用操作符 5、逻辑测试&#xff08;短路运算&#xff09;5.1 格式5.2 常用操作符 6、双中括号6.1 格式6.2 说明 二、if语句1、单分…

遗传算法原理详细讲解(算法+Python源码)

博主介绍&#xff1a;✌专研于前后端领域优质创作者、本质互联网精神开源贡献答疑解惑、坚持优质作品共享、掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战&#xff0c;深受全网粉丝喜爱与支持✌有需要可以联系作者我哦&#xff01; &#x1f345;文末获…

配置ntp时间服务器和ssh免密登录实验

1&#xff1a;配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 第一步&#xff0c;将服务器的时间同步对象改为阿里的时间服务器&#xff08;这样比较精准&#xff09; 先启动服务&#xff1a;[rootserver ~]# systemctl start chronyd 进入配置文件&#xf…

dolphinscheduler节点二次开发需要改动的部分

dolphinscheduler节点二次开发需要改动的部分 前端 在dolphinscheduler-ui/public/images/task-icons/目录下新增两个节点的logo图片&#xff0c;一个为激活状态的一个为非激活状态的&#xff0c;如下。 修改文件dolphinscheduler-ui/src/views/projects/task/constants/task…

爬取咚漫漫画

一、数据来源分析1.确定自己的需求&#xff1a;采集哪个网站的上面的数据内容正常的访问流程&#xff1a;1.选中漫画--->目录页面 &#xff08;请求列表页面&#xff0c;获取所有的章节链接&#xff09;2.选择一个漫画内容--->漫画页面 &#xff08;请求章节链接&#xf…

基于TriDet的时序动作检测算法训练自己的slowfast数据

最近一直在研究时序动作识别和检测&#xff0c;也一直关注着目前的最新进展&#xff0c;有好的算法&#xff0c;我都会在我自己的数据集上运行看看&#xff0c;一方面是为自己累积相关算法&#xff0c;另一方面也是想看看&#xff0c;目前最新的算法是否可以应用到一些项目上。…

对话顺网科技创始人华勇:建立坚定的AI信仰,从内而外全面拥抱AI

“ 进军AI智算时代的号角已被吹响” 整理 | 梦婕 编辑 | 欣桐 出品&#xff5c;极新 1月18日&#xff0c;顺网科技以“跃迁向未来”为主题的战略升级暨产品升级发布会在杭州圆满召开。顺网科技公布了新战略——“立足算力&#xff0c;聚焦AI”&#xff0c;并揭晓了全新的品…

arcgis 面要素shp数据处理

面要素是工作中用到最多的&#xff0c;那么面要素是如何形成的呢&#xff0c;主要还是由闭合的线要素转换而成。在面要素数据中常用的有以下几点&#xff1a; 一、 线转面&#xff08;要素转面&#xff09; 通过上一篇得到了点转线的要素&#xff0c;那么根据上节的线要素&am…

系统移植 day2 bootloader->u-boot 移植

一、栈的复习 1、满栈&#xff1a;当堆栈指针SP总是指向最后压入堆栈的数据&#xff0c;称为满栈&#xff1b; 2、空栈&#xff1a;当堆栈指针SP总是指向下一个将要放入数据的空位置&#xff0c;称为空栈&#xff1b; 满栈状态下&#xff0c;先移动指针&#xff0c;后赋值. 空…