文章目錄
一、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");
}
}
啓動客戶端: