日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java中使用Protocol Buffer

發布時間:2023/12/16 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。