Java中使用Protocol Buffer

一、Protocol Buffer简介

什么是 Google Protocol Buffer(简称protobuf)?
protobuf 是一个用于网络传输的序列化协议。
我们知道,要用于网络传输 必须是二进流,对象是不能直接在网络中传输的,所以在进行rpc调用时,必须将对象序列化(转成二进制)进行网络通信。 在接收消息时,需要将二进制流再反序列化(从二进制转回java对象)。
通常的序列化协议有:json 、xml、java Serializable、protobuf
而protobuf 相比json xml java Serializable,
它的优点在于:它更小、更快、更简单。
第一:它使用proto编译器,自动进行序列化和反序列化,速度快,比xml json快上了20~100倍;
第二:它的压缩效果好,它序列化后的数据量体积小,因为体积小,传输起来带宽和速度上会有优化。

二、Protocol Buffer的使用(Java)

下面用一个例子来说明如何在java中使用Protocol Buffer。

首先我们需要去Google的网站上下载Protocol Buffer的编译器:https://developers.google.com/protocol-buffers/docs/downloads

在Java中使用ProtocolBuffer的步骤大致分为下面这几点:

1、编写.proto文件,定义消息类型

如何编写.proto 文件,看下面这个例子:

//用哪个版本语法,
syntax = "proto2";
package com.clock.bone.message;

option java_outer_classname = "PersonBean";

message Person {
    required string name = 1;
    required int32 age = 2;
    optional string gender = 3;
}

2、使用ProtocolBuffer的编译器,将.proto文件编译成对应的java文件

执行下面命令将proto文件,编译成java文件(首先你需要下载proto.exe编译器)

#在D:\myFile\springmvc\src\main\java 目录下,运行下面命令
# 在 com.clock.bone.message目录下生成PersonBean.java文件
protoc.exe --java_out=./ PersonMsg.proto

项目中生成的PersonBean.java结构如下:
在这里插入图片描述

3、在你的项目中引入protobuf 依赖

<dependency>
  <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.5.1</version>
</dependency>

4、在Java代码中使用上一步编译好的java文件

服务端代码:

public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(9090);
        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());
        }
    }
}

启动服务端:
在这里插入图片描述

客户端代码:

public class Client {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("localhost", 9090);
        //构造一个Person对象
        PersonBean.Person person = PersonBean.Person.newBuilder().setName("zhangsan")
                .setAge(50).setGender("male").build();
        OutputStream os = socket.getOutputStream();
        //将Person对象写到输出流中
        os.write(person.toByteArray());
        os.flush();
        //这里注意一定要关闭流,否则服务端会报错
        os.close();
        System.out.println("client send person");
    }
}

启动客户端:
在这里插入图片描述

启动客户端后,服务接收数据如下:

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值