ProtoBuf介绍

ProtoBuf 是google团队开发的用于高效存储和读取结构化数据的工具,google出品,必属精品。

目前最新版本为3。文档地址:https://developers.google.com/protocol-buffers/docs/proto3

相比于xmljsonprotobuf压缩率更高,传输高效,自然很节省流量。

protobuf支持跨语言,貌似前后端使用javaJavaScript的众多吧。

整理下java和JavaScript的例子

需要下载protoc可执行文件。通过编写.proto,命令生成相应的文件,比如java,js等。

编写Person.proto。

具体语法可以查看官网,这是最基础的一个对象。

syntax = "proto3";
option java_package = "com.dahai.protobuf";
option java_outer_classname = "PersonModel"; message Person {
int32 id = 1;
string name = 2;
int32 age = 3;
string email = 4;
}

可以通过protoc命令生成,此处为了方便起见,使用maven plugin来生成(原理一直,会下载相应的protoc可执行文件)

创建maven工程,在resources目录创建proto文件夹,将示例文件Person.proto放入改文件夹下。

pom.xml引入相应依赖

    <dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.11.1</version>
</dependency>

pom.xml引入相应的插件


<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.6.2</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.6.1</version>
<extensions>true</extensions>
<configuration>
<!--指定项目的proto文件目录-->
<protoSourceRoot>src/main/resources/proto</protoSourceRoot>
<clearOutputDirectory>false</clearOutputDirectory>
<!--不存在会自动下载-->
<protocArtifact>
com.google.protobuf:protoc:3.11.1:exe:${os.detected.classifier}
</protocArtifact>
<pluginId>grpc-java</pluginId>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

执行标红箭头的命令即可生成。

将生成的文件放入相应的包下面即可

demo测试

    @Test
public void test3() throws InvalidProtocolBufferException {
// 创建person对象
Person person = Person.newBuilder()
.setId(1)
.setName("陈海洋")
.setAge(18)
.setEmail("1559843332@qq.com")
.build(); System.out.println(person); // 反序列化获取person
byte[] bytes = person.toByteArray();
Person newPerson = Person.parseFrom(bytes);
System.out.println(newPerson);
}

使用protobuf是为了节省用户流量,来实战下。

java作为服务端+客户端测试

// 暴露接口,返回二进制数据
@GetMapping("/person/{id}")
public byte[] person(@PathVariable("id") Integer id) { Person person = Person.newBuilder()
.setId(id)
.setName("陈海洋")
.setAge(18)
.setEmail("1559843332@qq.com")
.build(); return person.toByteArray();
} // RestTemplate客户端测试
@Test
public void test1() throws IOException { RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost:8881/demo/person/2";
ResponseEntity<Resource> forEntity = restTemplate.getForEntity(url, Resource.class);
Person person = Person.parseFrom(forEntity.getBody().getInputStream());
System.out.println(person); }

客户端前端调用示例

既然是跨平台,js肯定也是可以解析二进制流的。

前端也可以通过proto文件生成相应的js。如下是js反序列化示例

为了写前端demo,也是爬了好多坑,都是泪啊!(本想基于原生的)

import messages from '../../utils/proto/person.js'

axios({
method: 'get',
url: 'http://localhost:8881/demo/person/10',
responseType: 'arraybuffer'
}).then((res) => {
console.log('res.data', res.data)
var person = messages.Person.decode(new Uint8Array(res.data))
console.log('java', person)
console.log('java id', person.id)
}
)

这只是demo,实际项目一般不会反悔bety[]数据。在我们的业务中是通过websocket来传输的。

项目地址

https://github.com/chywx/spring-boot-chy/tree/master/chy-protobuf

参考

用Maven实现一个protobuf的Java例子

protobufjs语法

axios 基本用法

JS中ArrayBuffer和Uint8Array区别

HTML5 Blob与ArrayBuffer、TypeArray和字符串String之间转换

protobuf基于java和javascript的使用的更多相关文章

  1. Rhino -- 基于java的javascript实现

    http://www.cnblogs.com/cczw/archive/2012/07/16/2593957.html

  2. 基于类(Java)和基于原理(JavaScript)的对象系统的比较

    Java:面向对象编程语言,吸收了C++语言的各种优点,丢掉了C++让人头疼的多继承.指针等概念.具有功能强大和简单易用的两大特征.Java具有简单性.面向对象.分布式.健壮性.安全性.平台独立与可移 ...

  3. 基于java平台的常用资源整理

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

  4. 基于Java Netty框架构建高性能的部标808协议的GPS服务器

    使用Java语言开发一个高质量和高性能的jt808 协议的GPS通信服务器,并不是一件简单容易的事情,开发出来一段程序和能够承受数十万台车载接入是两码事,除去开发部标808协议的固有复杂性和几个月长周 ...

  5. 这里整理了基于java平台的常用资源

    这里整理了基于java平台的常用资源 翻译 from :akullpp | awesome-java 大家一起学习,共同进步. 如果大家觉得有用,就mark一下,赞一下,或评论一下,让更多的人知道.t ...

  6. WebView上实现Java与JavaScript交互

    在安卓开发上,考虑到开发效率和界面更新,有时使用WebView结合web页面技术,可以快速迭代地开发移动应用.WebView加载资源的速度并不慢,但是如果资源多了,就很慢.图片.css.js.html ...

  7. 30个深度学习库:按Python、C++、Java、JavaScript、R等10种语言分类

    30个深度学习库:按Python.C++.Java.JavaScript.R等10种语言分类 包括 Python.C++.Java.JavaScript.R.Haskell等在内的一系列编程语言的深度 ...

  8. Java和JavaScript中使用Json方法大全

    林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka   摘要:JSON(JavaScript Object Notation) 是一种轻量级的数 ...

  9. Nashorn 在JDK 8中融合Java与JavaScript之力

    从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调 ...

随机推荐

  1. 利用FFmpeg 将 rtsp 获取H264裸流并保存到文件中

    既然已经可以通过 RTSP 获取h264 裸流了.那么通过 FFmpeg 将其保存到文件中怎么做呢? 一.首先RTSP获取 h264 裸流 我们上面两篇文章主要讲的是通过 rtsp://Your ip ...

  2. DC1(msf drupal7+suid-find提权)

    这边我们靶机是仅主机模式,IP是192.168.56.101,,直接上msf拿到shell,  不过payload要改一下 改成php/meterperter/bind_tcp 拿到shell了 ,采 ...

  3. Emoji of github & twitter

    Emoji cheat sheet http://www.emoji-cheat-sheet.com/ https://github.com/xgqfrms/emoji-cheat-sheet.com ...

  4. How to enable HTTPS for local development in macOS using Chrome

    How to enable HTTPS for local development in macOS using Chrome HTTPS, macOS, Chrome local HTTPS htt ...

  5. npm-run-all

    npm-run-all npm scripts https://www.npmjs.com/package/npm-run-all A CLI tool to run multiple npm-scr ...

  6. React useEffect in depth

    React useEffect in depth useEffect class DogInfo extends React.Component { controller = null state = ...

  7. py python-pptx 创建ppt

    创建一个简单的PPTX文件 from pptx import Presentation class Main(): def __init__(self): prs = Presentation() t ...

  8. c++ 动态解析PE导出表

    测试环境是x86 main #include <iostream> #include <Windows.h> #include <TlHelp32.h> #incl ...

  9. Python爬虫_qq音乐示例代码

    import requests url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp' for x in range(5): headers ...

  10. 2.go语言入门----变量类型、声明变量、数组、切片

    基本变量类型 介绍几种基本的变量类型:字符串.int.float.bool package main import ( "fmt" ) // 列举几种非常基本的数据类型 func ...