Java中使用Protocol Buffer
一、Protocol Buffer簡介
什么是 Google Protocol Buffer? 假如您在網上搜索,應該會得到類似這樣的文字介紹:Google Protocol Buffer( 簡稱 Protobuf) 是 Google 公司內部的混合語言數據標準,目前已經正在使用的有超過 48,162 種報文格式定義和超過 12,183 個 .proto 文件。他們用于 RPC 系統和持續數據存儲系統。
Protocol Buffers 是一種輕便高效的結構化數據存儲格式,可以用于結構化數據串行化,或者說序列化。它很適合做數據存儲或 RPC 數據交換格式。可用于通訊協議、數據存儲等領域的語言無關、平臺無關、可擴展的序列化結構數據格式。目前提供了 C++、Java、Python 三種語言的 API。
如果你在開發中使用過常用的數據交換格式如xml、json,那么protocol buffer也不是什么神奇的東西了,它和xml、json類似,也可以作為開發中的一種數據交換格式,只不過相較xml和json,protocol buffer的優點更明顯,它更小、更快、更簡單。
二、Protocol Buffer的使用(Java)
下面用一個例子來說明如何在java中使用Protocol Buffer。
首先我們需要去Google的網站上下載Protocol Buffer的編譯器:https://developers.google.com/protocol-buffers/docs/downloads,這里注意需要科學上網。
在Java中使用ProtocolBuffer的步驟大致分為下面這幾點:
(1)編寫.proto文件,定義消息類型
(2)使用ProtocolBuffer的編譯器,將.proto文件編譯成對應的java文件
(3)在Java代碼中使用上一步編譯好的java文件
如何編寫.proto文件呢,看下面一個例子:
package com.demo.msg;option java_outer_classname = "PersonBean";message Person {required string name = 1;required int32 age = 2;optional string gender = 3; }上面的代碼可以保存到一個Person.proto文件中,其中package指定了包名,和java中的包名類似,option java_outer_classname = "PersonBean";這句指定了編譯器在編譯.proto文件時,輸出的java類的類名,接著使用message定義了一個名為Person的消息,里面包含3個成員變量,其中用required修飾的變量代表必須的,optional修飾的變量代表是可選的,這里定義消息的形式跟java中定義類非常相似。下面需要用ProtocolBuffer的編譯器來編譯上面的消息,我們從google的網站上下載下來的是一個protoc.exe文件,將該文件跟上面定義的消息文件Person.proto放在同一個目錄下,然后在命令行中進入該目錄,執行下面的命令:
protoc.exe --java_out=./ Person.proto就在當前目錄下生成了對應的java文件PersonProto.java下面可以在Java項目中使用上面編譯好的PersonProto.java文件了,我們新建一個java項目,項目結構如下:
上面需要注意的是,我們在lib目錄下引入了protobuf-java-2.5.0.jar包,這個包就是用來對ProtocolBuffer消息進行序列化和反序列化的.
下面定義一個Server類,用于處理客戶端發送過來的消息,代碼如下:
package com.demo.server;import com.demo.constant.Constants; import com.demo.msg.PersonBean; import com.google.protobuf.ByteString;import java.net.ServerSocket; import java.net.Socket;/*** Created by yubo7 on 2016/8/16.*/ 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對象PersonBean.Person person = PersonBean.Person.parseFrom(ByteString.readFrom(socket.getInputStream()));if(person != null) {System.out.println("server received data:\n" + person.toString());}}} 下面定義一個Client類,用于生成一個Person類并發送給Server,代碼如下: package com.demo.client;import com.demo.constant.Constants; import com.demo.msg.PersonBean;import java.io.OutputStream; import java.net.Socket;/*** Created by yubo7 on 2016/8/16.*/ public class Client {public static void main(String[] args) throws Exception {Socket socket = new Socket("localhost", Constants.PORT);//構造一個Person對象PersonBean.Person person = PersonBean.Person.newBuilder().setName("zhangsan").setAge(20).setGender("male").build();OutputStream os = socket.getOutputStream();//將Person對象寫到輸出流中os.write(person.toByteArray());os.flush();//這里注意一定要關閉流,否則服務端會報錯os.close();System.out.println("client send person");}} 上面的PORT為常量,定義在Constants類中,代碼如下: package com.demo.constant;/*** Created by yubo7 on 2016/8/16.*/ public class Constants {public static final int PORT = 9988;} 到這里就可以測試程序了,我們先啟動Server,在控制臺打印的內容如下圖:
然后再啟動Client,在控制臺打印的內容如下圖:
然后再切換回Server的控制臺,可以看到控制臺中的打印如下圖:
可以看到,控制臺中打印了客戶端發送過去的Person消息,這樣,一個使用ProtocolBuffer來進行數據發送和接收的java程序就完成了。
本文源代碼已托管到GitHub:https://github.com/yubo725/ProtocolBufferDemo
參考文章:http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/
總結
以上是生活随笔為你收集整理的Java中使用Protocol Buffer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据流通利用 | 数据产权研究综述
- 下一篇: java美元兑换,(Java实现) 美元