资讯专栏INFORMATION COLUMN

Protocol Buffers学习笔记

habren / 2410人阅读

摘要:学习笔记简介是发明的一种数据交换格式,独立于语言,独立于平台。此包可以对消息进行序列化和反序列化。端已经接收到消息。至此中使用的实例就完成了。参考官方文档中使用

Protocol Buffers学习笔记 1. 简介

Protocol Buffers是google发明的一种数据交换格式,独立于语言,独立于平台。与其他的数据交换格式有所不同,Protocol Buffers是一种二进制的格式,因此在网络传输的时候效率更高,相对于json它的文件体积更小,相对于xml,它的解析速度更快。

作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于网络传输、配置文件、数据存储等领域。

2. 在java中的使用 2.1 新建test.proto文件

</>复制代码

  1. syntax = "proto2";
  2. package tutorial;
  3. option java_package = "com.example.tutorial";
  4. option java_outer_classname = "AddressBookProtos";
  5. message Person {
  6. required string name = 1;
  7. required int32 id = 2;
  8. optional string email = 3;
  9. enum PhoneType {
  10. MOBILE = 0;
  11. HOME = 1;
  12. WORK = 2;
  13. }
  14. message PhoneNumber {
  15. required string number = 1;
  16. optional PhoneType type = 2 [default = HOME];
  17. }
  18. repeated PhoneNumber phones = 4;
  19. }
  20. message AddressBook {
  21. repeated Person people = 1;
  22. }
2.2 编译protot文件

下载编译器:

</>复制代码

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

一般在每个发布版本的protoc-{版本号}-{平台}.zip压缩包里面包含对应的编译器。由于LZ用的是win系统,故下载了protoc-3.6.1-win32.zip,解压之后在bin目录下会看到一个proto.exe文件。在proto.exe所在的目录下面就可以使用protoc命令进行编译了。

</>复制代码

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

实例:

</>复制代码

  1. C:UserswangjunDownloads>protoc -I=./ --java_out=./ ./test.proto

编译成功后会在当前目录下生成对用的java文件:

</>复制代码

  1. C:UserswangjunDownloadscomexample
  2. utorialAddressBookProtos.java
2.3 在项目中使用编译好的java文件

新建一个java工程,目录结构如下:

</>复制代码

  1. com
  2. ├─example
  3. │ └─tutorial
  4. AddressBookProtos.java
  5. └─wangjun
  6. └─protoc
  7. Client.java
  8. Constants.java
  9. Server.java

导入protobuf-java-3.5.1.jar(LZ使用的是此版本,读者请自行下载适用版本)。此包可以对ProtocolBuffer消息进行序列化和反序列化。

编写实例代码:

1)Constants.java

</>复制代码

  1. package com.wangjun.protoc;
  2. public class Constants {
  3. public static final int PORT = 9988;
  4. }
2)Server.java

</>复制代码

  1. package com.wangjun.protoc;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4. import com.example.tutorial.AddressBookProtos;
  5. import com.google.protobuf.ByteString;
  6. public class Server {
  7. public static void main(String[] args) throws Exception {
  8. ServerSocket ss = new ServerSocket(Constants.PORT);
  9. System.out.println("server started...");
  10. Socket socket = ss.accept();
  11. System.out.println("a client connected!");
  12. //从输入流中解析出Person对象
  13. AddressBookProtos.Person person = AddressBookProtos.Person.parseFrom(ByteString.readFrom(socket.getInputStream()));
  14. if(person != null) {
  15. System.out.println("server received data:
  16. " + person.toString());
  17. }
  18. }
  19. }
3)Client.java

</>复制代码

  1. package com.wangjun.protoc;
  2. import java.io.OutputStream;
  3. import java.net.Socket;
  4. import com.example.tutorial.AddressBookProtos;
  5. public class Client {
  6. public static void main(String[] args) throws Exception {
  7. Socket socket = new Socket("localhost", Constants.PORT);
  8. //构造一个Person对象
  9. AddressBookProtos.Person person = AddressBookProtos.Person.newBuilder().setName("zhangsan")
  10. .setId(20).setEmail("zhangsan@xxxmail.com").build();
  11. OutputStream os = socket.getOutputStream();
  12. //将Person对象写到输出流中
  13. os.write(person.toByteArray());
  14. os.flush();
  15. //这里注意一定要关闭流,否则服务端会报错
  16. os.close();
  17. System.out.println("client send person");
  18. }
  19. }
2.4 测试

先运行server。

</>复制代码

  1. server started...

再运行client。

</>复制代码

  1. client send person

server端已经接收到消息。

</>复制代码

  1. server started...
  2. a client connected!
  3. server received data:
  4. name: "zhangsan"
  5. id: 20
  6. email: "zhangsan@xxxmail.com"

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

参考:

</>复制代码

  1. 官方文档 https://developers.google.com...

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76573.html

相关文章

  • 如何在PHP中处理Protocol Buffers数据

    摘要:我们知道是定义的一种跨语言跨平台可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据量小,解析效率高。官方只支持,如果想在中使用,需要借助于第三方的扩展,使用方法如下。 我们知道Protocol Buffers是Google定义的一种跨语言、跨平台、可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据...

    ivyzhang 评论0 收藏0
  • php中使用protobuffer

    摘要:简介是谷歌出品的跨平台跨语言可扩展的数据传输及存储的协议,是高效的数据压缩编码方式之一。相比于来说,更加小巧,更加快速,更加简单。此外,由于其在内网高效的数据交换效率,是被广泛应用于微服务的,在谷歌的开源框架即是基于此构建起来的。 Protobuf 简介 protobuf(Protocol buffers)是谷歌出品的跨平台、跨语言、可扩展的数据传输及存储的协议,是高效的数据压缩编码方...

    biaoxiaoduan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<