Java中使用Protocol Buffer

一、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");
    }
}

啓動客戶端:
在這裏插入圖片描述

啓動客戶端後,服務接收數據如下:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章