一、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相关推荐

  1. 在Java中使用Protocol Buffers

    这份教程为Java开发者提供了使用 Protocol Buffer 的基本介绍.通过创建一个简单的示例应用,它展示了 在 .proto 文件中定义消息格式. 使用 Protocol Buffer 编译 ...

  2. python中使用 protocol buffer(Protobuf)

    项目中引入proto的依赖 [两种方法]: 方法1. 官网下载对应的语言包,https://github.com/protocolbuffers/protobuf/releases 这里选择pytho ...

  3. js中应用protocol buffer

    前段时间公司项目需要用到protocol buffer数据传输协议,这是什么东西,根本没接触过,好好的json干嘛不用?怀着好奇心去了解学习,最后顺利运用.下面是一些是经验,希望能帮到一些人. 首先我 ...

  4. Android 中使用Protocol Buffer

    宝宝其实是根据一老外的文章学习的,原文: https://medium.com/@elye.project/simple-android-protobuf-tutorial-with-actual-c ...

  5. Tensorflow中的Protocol Buffer

    Protocol Buffer是谷歌公司开发的处理结构化数据的工具.注意这里介绍的结构化数据和大数据中的结构化数据的概念不同,这里的结构化数据指的是拥有多种属性的数据.比如一个用户:包含名字,ID,和 ...

  6. 学习笔记:Java Protocol Buffer的使用和编码原理学习

    一.protocolbuffer简介: protocol buffer 是 google 的一种数据交换的格式,它独立于语言,独立于平台.google 提供了三种语言的实现:java.c++ 和 py ...

  7. Java NIO_I/O基本概念_Java中的缓冲区(Buffer)_通道(Channel)_网络I/O

    I/O基本概念 缓冲区基础 缓冲区是I/O的基础, 进程使用read(), write()将数据读出/写入从缓冲区中; 当缓冲区写满, 内核向磁盘发出指令, 将缓冲区中数据写入磁盘中(这一步不需要CP ...

  8. Protocol Buffer技术详解(语言规范)

     该系列Blog的内容主体主要源自于Protocol Buffer的官方文档,而代码示例则抽取于当前正在开发的一个公司内部项目的Demo.这样做的目的主要在于不仅可以保持Google文档的良好风格 ...

  9. Protocol Buffer基本语法

    为什么使用Protocol Buffer? 在回答这个问题之前,我们还是先给出一个在实际开发中经常会遇到的系统场景.比如:我们的客户端程序是使用Java开发的,可能运行自不同的平台,如:Linux.W ...

  10. 快来看看Google出品的Protocol Buffer,别仅仅会用Json和XML了

    前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 事实上 是 Google出品的一种轻量 & 高效的结构化数据 ...

最新文章

  1. 零基础自学python的app-零基础转行Python,为什么有些人自学几天就放弃了?
  2. 好文推荐 | MySQL binlog应用场景与原理深度剖析
  3. self-在类的外部给对象增加属性
  4. mysql生活应用_MySQL应用
  5. 近5年133个Java面试问题列表
  6. R语言第五讲 之R语言 变量
  7. command对象的三个主要方法 1120
  8. oracle 视图及函数授权,Oracle常见1000问之内部函数及管理视图
  9. 网易云深度学习第二课notebook1
  10. 12019.LMT84模拟温度传感器
  11. 2021年中国专业话筒市场趋势报告、技术动态创新及2027年市场预测
  12. 浅谈过程和结果的关系
  13. OC代码调用C++代码的回调函数步骤
  14. emc re 整改 超标_两种常见EMC整改流程
  15. 【MySQL】Mcafee审计插件
  16. R语言 —— 包(package)的下载和使用
  17. RationalDMIS7.0 编程测量快速入门教程(山涧果子)
  18. operator int()用法
  19. 汽车领域多语种迁移学习挑战赛-Coggle 30 Days of ML
  20. oracle gho系统吗,系统镜像GHO、WIM、ESD几种格式的区别

热门文章

  1. Spark基本工作流程和作业调度
  2. Linux下3种常用的网络测速工具简介
  3. sever企业版密钥 sql_SQL Server2016企业版 附全版本key(转载)
  4. 经济基础知识(中级)【6】
  5. java 如何将word 转换为ftl_使用FreeMarker导出word文档(支持导出图片)
  6. 干货|TPM管理系列之六源改善
  7. 红米Note5官方刷机日记 - 小米助手Recovery刷机
  8. 洛阳出发自驾不到半天就能看“海”!人少景美路途近!
  9. SecureCRT键盘无法输入
  10. mysql 公历变农历_巧用SQL函数让公历变农历