文章目录
一、Protocol Buffer简介
什么是 Google Protocol Buffer(简称protobuf)?
protobuf 是一个用于网络传输的序列化协议。
我们知道,要用于网络传输 必须是二进流,对象是不能直接在网络中传输的,所以在进行rpc调用时,必须将对象序列化(转成二进制)进行网络通信。 在接收消息时,需要将二进制流再反序列化(从二进制转回java对象)。
通常的序列化协议有:json 、xml、java Serializable、protobuf
而protobuf 相比json xml java Serializable,
它的优点在于:它更小、更快、更简单。
第一:它使用proto编译器,自动进行序列化和反序列化,速度快,比xml json快上了20~100倍;
第二:它的压缩效果好,它序列化后的数据量体积小,因为体积小,传输起来带宽和速度上会有优化。
二、Protocol Buffer的使用(Java)
下面用一个例子来说明如何在java中使用Protocol Buffer。
首先我们需要去Google的网站上下载Protocol Buffer的编译器:https://developers.google.com/protocol-buffers/docs/downloads
在Java中使用ProtocolBuffer的步骤大致分为下面这几点:
1、编写.proto文件,定义消息类型
如何编写.proto 文件,看下面这个例子:
//用哪个版本语法,
syntax = "proto2";
package com.clock.bone.message;
option java_outer_classname = "PersonBean";
message Person {
required string name = 1;
required int32 age = 2;
optional string gender = 3;
}
2、使用ProtocolBuffer的编译器,将.proto文件编译成对应的java文件
执行下面命令将proto文件,编译成java文件(首先你需要下载proto.exe编译器)
#在D:\myFile\springmvc\src\main\java 目录下,运行下面命令
# 在 com.clock.bone.message目录下生成PersonBean.java文件
protoc.exe --java_out=./ PersonMsg.proto
项目中生成的PersonBean.java结构如下:
3、在你的项目中引入protobuf 依赖
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.5.1</version>
</dependency>
4、在Java代码中使用上一步编译好的java文件
服务端代码:
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(9090);
System.out.println("server started...");
Socket socket = ss.accept();
System.out.println("a client connected!");
//从输入流中解析出Person对象
PersonBean.Person person = PersonBean.Person.parseFrom(ByteString.readFrom(socket.getInputStream()));
if(person != null) {
System.out.println("server received data:\n" + person.toString());
}
}
}
启动服务端:
客户端代码:
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("localhost", 9090);
//构造一个Person对象
PersonBean.Person person = PersonBean.Person.newBuilder().setName("zhangsan")
.setAge(50).setGender("male").build();
OutputStream os = socket.getOutputStream();
//将Person对象写到输出流中
os.write(person.toByteArray());
os.flush();
//这里注意一定要关闭流,否则服务端会报错
os.close();
System.out.println("client send person");
}
}
启动客户端: