前端项目对接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.mzph.cn/news/643527.shtml

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

相关文章

SpringBoot-多数据源切换和事物处理(免费)

作者原始文章: SpringBoot-多数据源切换和事物处理 最新内容和改动请看上面的文章 安装 <dependency><groupId>com.gitee.huanminabc</groupId><artifactId>dynamic-datasource</artifactId><version>1.0.3-RELEASE</version> <…

算法训练day21Leetcode530二叉搜索树的最小绝对差501二叉搜索中的众数236二叉树最近公共祖先

530 二叉搜索树的最小绝对差 题目描述 https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/ 我的想法 中序遍历二叉树存入数组&#xff0c;再遍历数组求节点之间的最小差值 我的acm模式代码 #include <iostream> #include <vector&g…

几款提高开发效率的Idea 插件

1、ignore 开发代码过程中经常会有一些需要提交到代码仓库的文件&#xff0c;比如java文件生成的.class、.jar 等&#xff0c;如果将编译后的文件都提交到代码库那么代码库会很大&#xff0c;关键是没有必要。 这款插件就可以很方便的解决某类文件或者某个文件夹不需要提交到…

密闭空间可燃气体监测终端:守护燃气管网安全

在这个瞬息万变的时代&#xff0c;燃气安全问题始终是我们关注的焦点。地下燃气管线因老化或腐蚀等造成燃气泄漏&#xff0c;并扩散至地下管沟、窨井等相邻空间&#xff0c;引发爆炸的风险&#xff0c;尤其在密闭空间中潜在的危险常常不易察觉&#xff0c;但一旦发生事故&#…

ROS学习笔记10——自定义源文件调用

调用自定义源文件的时候需要配置cmakelists文件&#xff0c;刚学感觉还挺繁琐&#xff0c;用一个小案例记录一下。 1、随便写个头文件 在功能包的 include/功能包名 目录下创建一个头文件 记得在 .vscode 下 c_cpp_properties.json 的 includepath属性中把路径加进去 #ifnd…

OpenCV书签 #余弦相似度的原理与相似图片/相似文件搜索实验

1. 介绍 余弦相似度&#xff08;Cosine Similarity&#xff09;&#xff0c;又称为余弦相似性&#xff0c;是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度仅仅与向量的指向方向相关&#xff0c;与向量的长度无关&#xff0c;它将向量根据坐标值绘制到向量空间…

HJ10 字符个数统计【C语言】

【华为机试题 HJ10】字符个数统计 描述输入描述:输出描述:示例1示例2参考代码1描述 编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次 例…

1130 - Host 182.244.45,94‘ is not allowed to connect to this MySQL server

1130 - Host 182.244.45,94’ is not allowed to connect to this MySQL server MySQL错误代码 1130 表明连接 MySQL 服务器的主机被拒绝。在这个错误消息中&#xff0c;你提到的是主机 “182.244.45.94”&#xff0c;但可能有一个小错误&#xff0c;IP 地址中的逗号应该是点&…

5、直方图和密度图(数据分布)

创建直方图和密度图 在本教程中,您将了解有关直方图和密度图的所有知识。 文章目录 1、设置笔记本2、直方图3、密度图4、2D KDE 图4、颜色编码的图1、设置笔记本 我们首先设置编程环境。(此代码是隐藏的,但你可以通过点击此文本右侧的 “Code” 按钮来显示它。) In [1]: i…

SpringBoot3集成Zookeeper

一、简介 ZooKeeper是一个集中的服务,用于维护配置信息、命名、提供分布式同步、提供组服务。分布式应用程序以某种形式使用所有这些类型的服务。 二、环境搭建 1、修改配置文件 # 1、拷贝一份样本配置文件 cp zookeeper-3.8.3/conf/zoo_sample.cfg zookeeper-3.8.3/conf/…

【笔记】Android Telephony | SIM 卡管理和subId、slotId、phoneId 定义关系说明

相关业务背景 DSDS双卡双待 &#xff1a;手机可以插入两张手机卡&#xff0c;而且能同时待机&#xff0c;但是某一时刻只能有一张卡上有电话。 一个SIM卡代表一个账号&#xff0c;那么双卡手机就意味着多账户&#xff0c;需要增加多账户管理和业务处理。 账号管理&#xff1…

【Java 设计模式】行为型之责任链模式

文章目录 1. 定义2. 应用场景3. 代码实现结语 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;用于将请求发送者和接收者解耦&#xff0c;使得多个对象都有机会处理请求。责任链模式通过创建一个处理请求的链&#xff0c;…

【STM32】STM32学习笔记-W25Q64简介(37)

00. 目录 文章目录 00. 目录01. SPI简介02. W25Q64简介03. 硬件电路04. W25Q64框图05. Flash操作注意事项06. 预留07. 附录 01. SPI简介 在大容量产品和互联型产品上&#xff0c;SPI接口可以配置为支持SPI协议或者支持I 2 S音频协议。SPI接口默认工作在SPI方式&#xff0c;可以…

(2)(2.4) CRSF/ELRS Telemetry

文章目录 前言 1 ArduPilot 参数编辑器 前言 &#xff01;Note ELRS&#xff08;ExpressLRS&#xff09;遥控系统使用穿越火线协议&#xff0c;连接方式类似。不过&#xff0c;它不像穿越火线那样提供双向遥测。 TBS CRSF 接收机与 ArduPilot 的接口中包含遥测和遥控信息。…

【 CSS 】HTML5、CSS3 提高

人生犹如航海&#xff0c;不在于船在港口的安全&#xff0c;而在于船能否顺利航行&#xff0c;穿越重重风浪&#xff0c;抵达梦想的彼岸。 1. HTML5新特性 1.1 概述 HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等。 这些…

Webpack5 基本使用 - 2

常用 loader loader 是辅助打包工具。webpack 默认只能打包 js 文件&#xff0c;打包其它模块就需要配置 loader 来告诉 webpack 该怎么去打包其它文件。loader 可以将文件从不同的语言转换为 JavaScript。一类文件如果需要多个 loader 处理&#xff0c;loader 的执行顺序是从…

vue+openLayers闪烁图形/线段/点 都可以使用类似的方法

本文使用闪烁图形作为实例&#xff0c;线段和点都是类似的原理 基础方法 1.先定义两个样式&#xff0c;闪烁时两个样式相互交换 2.利用定时器&#xff08;单数的时候样式一&#xff0c;双数的时候样式二&#xff09;由此来实现闪烁效果 先给主要代码如下&#xff08;最后有全部…

uniapp vue3版本引用 jsencrypt加密库报错:“default“ is not exported by……

个人产生这个异常的原因&#xff1a;将历史项目&#xff08;vue2&#xff09;的jsencrypt文件复制到新项目&#xff08;vue3&#xff09;里直接引用报错。存在兼容问题&#xff0c;需要重新安装vue3版本的jsencrypt 安装依赖 npm install jsencrypt页面引入 import { JSEncry…

变压器消谐电阻器测试仪

产品概述 KDZD3000X消谐电阻器参数测试仪能实现自动检测消谐器在电流峰值为0.3mA、0.5mA 、1mA 、3mA 、5mA、10mA时相对应的电压峰值或有效值&#xff0c;并能自动绘制出消谐器伏安特性曲线图。 仪器依据的标准 Q/GDW415-2010《电磁式电压互感器用非线性电阻性消谐器技术规…

计算机二级Python基本排序题-序号45(补充)

1. 文件"singup.txt”中保存了若干条参加运动会学生的报名记录&#xff0c;每条记录的形式为“班级号_学号”&#xff0c;例如"A1_12”&#xff0c;将每个班级报名情按参加运动会人数从多到少排列&#xff08;假设不存在人数相同的情况&#xff09;并输出&#xff0c…