Protocol Buffers是google發明的一種數據交換格式,獨立於語言,獨立於平臺。與其餘的數據交換格式有所不一樣,Protocol Buffers是一種二進制的格式,所以在網絡傳輸的時候效率更高,相對於json它的文件體積更小,相對於xml,它的解析速度更快。java
做爲一種效率和兼容性都很優秀的二進制數據傳輸格式,能夠用於網絡傳輸、配置文件、數據存儲等領域。git
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; }
下載編譯器: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
新建一個java工程,目錄結構以下:socket
com ├─example │ └─tutorial │ AddressBookProtos.java │ └─wangjun └─protoc Client.java Constants.java Server.java
導入protobuf-java-3.5.1.jar
(LZ使用的是此版本,讀者請自行下載適用版本)。此包能夠對ProtocolBuffer消息進行序列化和反序列化。學習
編寫實例代碼:測試
package com.wangjun.protoc; public class Constants { public static final int PORT = 9988; }
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()); } } }
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"); } }
先運行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...