Protocol Buffers學習筆記

Protocol Buffers學習筆記

1. 簡介

Protocol Buffers是google發明的一種數據交換格式,獨立於語言,獨立於平臺。與其餘的數據交換格式有所不一樣,Protocol Buffers是一種二進制的格式,所以在網絡傳輸的時候效率更高,相對於json它的文件體積更小,相對於xml,它的解析速度更快。java

做爲一種效率和兼容性都很優秀的二進制數據傳輸格式,能夠用於網絡傳輸、配置文件、數據存儲等領域。git

2. 在java中的使用

2.1 新建test.proto文件

syntax = "proto2";

package tutorial;

option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}

2.2 編譯protot文件

下載編譯器:github

https://github.com/google/pro...

通常在每一個發佈版本的protoc-{版本號}-{平臺}.zip壓縮包裏面包含對應的編譯器。因爲LZ用的是win系統,故下載了protoc-3.6.1-win32.zip,解壓以後在bin目錄下會看到一個proto.exe文件。在proto.exe所在的目錄下面就能夠使用protoc命令進行編譯了。shell

protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto

實例:json

C:\Users\wangjun\Downloads>protoc -I=./ --java_out=./ ./test.proto

編譯成功後會在當前目錄下生成對用的java文件:網絡

C:\Users\wangjun\Downloads\com\example\tutorial\AddressBookProtos.java

2.3 在項目中使用編譯好的java文件

新建一個java工程,目錄結構以下:socket

com
    ├─example
    │  └─tutorial
    │          AddressBookProtos.java
    │
    └─wangjun
        └─protoc
                Client.java
                Constants.java
                Server.java

導入protobuf-java-3.5.1.jar(LZ使用的是此版本,讀者請自行下載適用版本)。此包能夠對ProtocolBuffer消息進行序列化和反序列化。學習

編寫實例代碼:測試

1)Constants.java

package com.wangjun.protoc;

public class Constants {

    public static final int PORT = 9988;
}

2)Server.java

package com.wangjun.protoc;

import java.net.ServerSocket;
import java.net.Socket;

import com.example.tutorial.AddressBookProtos;
import com.google.protobuf.ByteString;

public class Server {
    
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(Constants.PORT);
        System.out.println("server started...");
        Socket socket = ss.accept();
        System.out.println("a client connected!");
        //從輸入流中解析出Person對象
        AddressBookProtos.Person person = AddressBookProtos.Person.parseFrom(ByteString.readFrom(socket.getInputStream()));
        if(person != null) {
            System.out.println("server received data:\n" + person.toString());
        }
    }

}

3)Client.java

package com.wangjun.protoc;

import java.io.OutputStream;
import java.net.Socket;

import com.example.tutorial.AddressBookProtos;

public class Client {
    public static void main(String[] args) throws Exception {
        
        Socket socket = new Socket("localhost", Constants.PORT);
        //構造一個Person對象
        AddressBookProtos.Person person = AddressBookProtos.Person.newBuilder().setName("zhangsan")
                .setId(20).setEmail("zhangsan@xxxmail.com").build();
        OutputStream os = socket.getOutputStream();
        //將Person對象寫到輸出流中
        os.write(person.toByteArray());
        os.flush();
        //這裏注意必定要關閉流,不然服務端會報錯
        os.close();
        System.out.println("client send person");
    }

}

2.4 測試

先運行server。ui

server started...

再運行client。

client send person

server端已經接收到消息。

server started...
a client connected!
server received data:
name: "zhangsan"
id: 20
email: "zhangsan@xxxmail.com"

至此java中使用ProtocolBuffer的實例就完成了。

參考:

官方文檔 https://developers.google.com...

Java中使用Protocol Buffer https://blog.csdn.net/yubo_72...

相關文章
相關標籤/搜索