精华内容
下载资源
问答
  • protobuffer协议
    2021-10-06 16:50:48

    protobuf是由Google开发的一套对数据结构进行序列化的方法,可用做通信协议,数据存储格式等等。其特点是不限语言、不限平台、扩展性强。

    语言无关、平台无关:即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台。
    高效:即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
    扩展性、兼容性好:你可以更新数据结构,而不影响和破坏原有的旧程序。

    更多相关内容
  • Protobuf 协议

    2022-07-15 16:40:35
    Protobuf 协议

    Protobuf

    1.定义消息

    syntax = "proto3";
    
    message SearchRequest {
      string query = 1;
      int32 page_number = 2;
      int32 result_per_page = 3;
    }
    

    1.1 syntax

    syntax指定您使用的是proto3语法:如果您不这样做,协议缓冲区编译器将假定您使用的是proto2。这必须是文件的第一个非空、非注释行。

    1.2 分配标识号

    每个字段后面都有一个唯一的数字,这个就是标识号。这些标识号是用来在message的二进制格式中识别各个字段的,一旦开始使用就不能够再改变,每个message内唯一即可,不同的message定义可以拥有相同的标识号。

    注意:[1,15]之内的标识号在编码的时候会占用1个字节。[16,2047]之内的标识号占用2个字节。所以应该为那些频繁出现的消息元素保留 [1,15]之内的标识号。切记:要为将来有可能添加的、频繁出现的字段预留一些标识号。

    1.3 保留标识号(Reserved)

    如果你想保留一些标识号,留给以后用,可以使用下面语法:

    message Foo {
      reserved 2, 15, 9 to 11; // 保留2,15,9到11这些标识号
    }
    

    如果使用了这些保留的标识号,protocol buffer编译器会输出警告信息。

    1.4 注释

    单行注释://
    多行注释:/**/

    1.5 为消息定义包

    例子:

    package foo.bar;
    message Open { ... }
    

    1.6 关键字

    关键字说明
    required必须字段
    optional可选字段
    repeated表示该字段可以包含0~N个元素。其特性和optional一样,但是每一次可以包含多个值。可以看作是在传递一个数组的值。

    2.数据类型

    .proto TypeNotesC# Type
    doubledouble
    floatfloat
    boolbool
    string必须是UTF-8编码或者7-bit ASCII编码的文本string
    int32使用变长编码,编码负数的效率很低——如果字段可能有负数,请使用sint32。int
    sint32使用变长编码,这些编码在负值时比int32高效的多int
    uint32使用变长编码,无符号整数,无法表示负数unit
    int64同int32long
    sint64同int32long
    uint64同int32ulong
    fixed32总是四个字节。如果值经常大于2^32-4,则比uint32更有效uint
    fixed64总是8个字节。如果值经常大于2^64-8时,比uint64高效。ulong
    sfixed32总是4个字节int
    sfixed64总是8个字节long
    byte可以包含任意的字节序列。ByteString

    3.枚举

    syntax = "proto3";//指定版本信息,不指定会报错
    
    enum PhoneType //枚举消息类型,使用enum关键词定义,一个电话类型的枚举类型
    {
        //option allow_alias = true;  成员拥有相同的值应该加上这句
        //reserved 2, 15, 9 to 11;    也可声明保留类型
    
        MOBILE = 0; //proto3版本中,首成员必须为0
        HOME = 1;
        WORK = 2;
    }
    
    // 定义一个电话消息
    message PhoneNumber
    {
        string number = 1; // 电话号码字段
        PhoneType type = 2; // 电话类型字段,电话类型使用PhoneType枚举类型
    }
    

    4.数组类型

    在字段前面增加repeated关键词实现,标记当前字段是一个数组

    message Msg {
      // 整数数组
      repeated int32 nums = 1;
      // string 数组
      repeated string names = 2;
    }
    

    5.map(字典)类型

    • key_type可以是任何整数或字符串类型(除浮点类型和字节之外的任何标量类型)。请注意,枚举不是有效的key_type。
    • value_type 可以是除另一个映射之外的任何类型。
    • map 字段不能使用repeated关键字修饰。
    message Product
    {
        string name = 1; // 商品名
        // 定义一个k/v类型,key是string类型,value也是string类型
        map<string, string> attrs = 2; // 商品属性,键值对
    }
    

    6.消息(自定义类)嵌套

    6.1 引用其他消息类型的用法

    // 定义Result消息
    message Result {
      string url = 1;
      string title = 2;
      repeated string snippets = 3; // 字符串数组类型
    }
    
    // 定义SearchResponse消息
    message SearchResponse {
      // 引用上面定义的Result消息类型,作为results字段的类型
      repeated Result results = 1; // repeated关键词标记,说明results字段是一个数组
    }
    

    6.2 消息嵌套

    message SearchResponse {
      // 嵌套消息定义
      message Result {
        string url = 1;
        string title = 2;
        repeated string snippets = 3;
      }
      // 引用嵌套的消息定义
      repeated Result results = 1;
    }
    

    6.3 import导入其他proto文件定义的消息

    syntax = "proto3";
    // Result消息定义
    message Result {
     string url = 1;
     string title = 2;
     repeated string snippets = 3; // 字符串数组类型
    }
    
    syntax = "proto3";
    // 导入Result消息定义
    import "result.proto";
    
    // 定义SearchResponse消息
    message SearchResponse {
     // 使用导入的Result消息
     repeated Result results = 1; 
    }
    
    展开全文
  • netty中实现自定义协议

    为什么需要协议
    TCP/IP 中消息传输基于流的方式,没有边界。协议的目的就是划定消息的边界,制定通信双方要共同遵守的通信规则

    自定义协议要素
    魔数,用来在第一时间判定是否是无效数据包
    版本号,可以支持协议的升级
    序列化算法,消息正文到底采用哪种序列化反序列化方式,可以由此扩展,例如:json、protobuf、hessian、jdk
    指令类型,是登录、注册、单聊、群聊… 跟业务相关
    请求序号,为了双工通信,提供异步能力
    正文长度
    消息正文

    代码

    package cn.itcast.protocol;
    
    import cn.itcast.config.Config;
    import cn.itcast.message.LoginRequestMessage;
    import cn.itcast.message.Message;
    import io.netty.buffer.ByteBuf;
    import io.netty.channel.ChannelHandler;
    import io.netty.channel.ChannelHandlerContext;
    import io.netty.handler.codec.MessageToMessageCodec;
    import lombok.extern.slf4j.Slf4j;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.util.List;
    
    @Slf4j
    @ChannelHandler.Sharable
    /**
     * 必须和 LengthFieldBasedFrameDecoder 一起使用,确保接到的 ByteBuf 消息是完整的
     */
    public class MessageCodecSharable extends MessageToMessageCodec<ByteBuf, Message> {
        @Override
        public void encode(ChannelHandlerContext ctx, Message msg, List<Object> outList) throws Exception {
            ByteBuf out = ctx.alloc().buffer();
            // 1. 4 字节的魔数
            out.writeBytes(new byte[]{1, 2, 3, 4});
            // 2. 1 字节的版本,
            out.writeByte(1);
            // 3. 1 字节的序列化方式 jdk 0 , json 1
            out.writeByte(Config.getSerializerAlgorithm().ordinal());
            // 4. 1 字节的指令类型
            out.writeByte(msg.getMessageType());
            // 5. 4 个字节
            out.writeInt(msg.getSequenceId());
            // 无意义,对齐填充
            out.writeByte(0xff);
            // 6. 获取内容的字节数组
            byte[] bytes = Config.getSerializerAlgorithm().serialize(msg);
            // 7. 长度
            out.writeInt(bytes.length);
            // 8. 写入内容
            out.writeBytes(bytes);
            outList.add(out);
        }
    
        @Override
        protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
            int magicNum = in.readInt();
            byte version = in.readByte();
            byte serializerAlgorithm = in.readByte(); // 0 或 1
            byte messageType = in.readByte(); // 0,1,2...
            int sequenceId = in.readInt();
            in.readByte();
            int length = in.readInt();
            byte[] bytes = new byte[length];
            in.readBytes(bytes, 0, length);
    
            // 找到反序列化算法
            Serializer.Algorithm algorithm = Serializer.Algorithm.values()[serializerAlgorithm];
            // 确定具体消息类型
            Class<? extends Message> messageClass = Message.getMessageClass(messageType);
            Message message = algorithm.deserialize(messageClass, bytes);
    //        log.debug("{}, {}, {}, {}, {}, {}", magicNum, version, serializerType, messageType, sequenceId, length);
    //        log.debug("{}", message);
            out.add(message);
        }
    
    }
    
    

    服务端添加

    		//...
            MessageCodecSharable MESSAGE_CODEC = new MessageCodecSharable();
    		//...
    
    		//...
                serverBootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    protected void initChannel(SocketChannel ch) throws Exception {
                    //...
    				ch.pipeline().addLast(MESSAGE_CODEC);
    				//...
                    }
                });
                    //...
    		//...
    
    
    展开全文
  • Protobuf协议

    2022-03-07 19:36:44
    protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的...1、ProtoBuf协议说明 proto文件

    protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。

    由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。

    1、ProtoBuf协议说明

    proto文件定义了协议数据中的实体结构(message ,field)

    • 关键字message: 代表了实体结构,由多个消息字段(field)组成。
    • 消息字段(field): 包括数据类型、字段名、字段规则、字段唯一标识、默认值
    • 数据类型:如下图所示
    • 字段规则:
      • required:必须初始化字段,如果没有赋值,在数据序列化时会抛出异常
      • optional:可选字段,可以不必初始化。
      • repeated:数据可以重复(相当于java 中的Array或List)
      • 字段唯一标识:序列化和反序列化将会使用到。
      • 默认值:在定义消息字段时可以给出默认值。
        在这里插入图片描述

    2、protoBuf数据协议的优势

    • 平台无关,语言无关,可扩展;
    • 提供了友好的动态库,使用简单;
    • 解析速度快,比对应的XML快约20-100倍;
    • 序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。

    说明: 数据量小是因为,Protobuf 序列化后所生成的二进制消息非常紧凑,这得益于 Protobuf
    采用的非常巧妙的little-endian编码方法。

    转换速度快。首先我们来了解一下 XML 的封解包过程。XML 需要从文件中读取出字符串,再转换为 XML 文档对象结构模型。之后,再从 XML 文档对象结构模型中读取指定节点的字符串,最后再将这个字符串转换成指定类型的变量。

    这个过程非常复杂,其中将 XML 文件转换为文档对象结构模型的过程通常需要完成词法文法分析等大量消耗 CPU 的复杂计算。

    反观 Protobuf,它只需要简单地将一个二进制序列,按照指定的格式读取到 C++ 对应的结构类型中就可以了。从上一节的描述可以看到消息的 decoding 过程也可以通过几个位移操作组成的表达式计算即可完成。速度非常快。

    展开全文
  • protobuffer生成协议文件

    千次阅读 2015-04-10 15:54:37
    生成cs脚本说明: 1 cd当前目录 2 gen_cshape.bat  gen_cshape.bat 参数说明: protogen -i:protoID.proto -o:protoID.cs 前面标识 proto文件,后面...*********************************
  • protobuf协议使用详解

    千次阅读 2020-10-12 13:34:02
    一、protobuf协议详解 在protobuf中,协议是由一系列的消息(message)组成的,如下所示: systax = "proto3"; //表明使用proto3语法;如果你没有指定这个,编译器会使用proto2语法;这个指定语法行必须是文件的非空...
  • 就是因为这五个字节,不管你是 Protobuf 还是 JSON,都注定了 gRPC 只能是二进制协议,UNIX 下常用的文本工具都无法很好地处理 gRPC 的通信内容。 gRPC 还定义了自己的返回状态和消息,分别用 grpc-status 和 grpc-...
  • 网络传输协议,简称为传送协议(Communications Protocol),是指计算机通信的共用语言。目前最为普遍的计算机通信为网络通信,因此“传送协议”一般是指计算机通信的传送协议,比如TCP/IP等。然而,传送协议也存在...
  • 转载自:https://blog.csdn.net/iningwei/article/details/100107254 前言 nodejs游戏服务器开发系列文章以nodejs+Typescript+CocosCreator+WebSocket为例,搭建服务器和客户端。 protobuf 暂时无纯ts框架的pb库,...
  • Protobuf 属性解释

    2021-07-03 16:38:54
    } 1.3.4 enum类型定义 proto协议支持使用枚举类型,和正常的编程语言一样,枚举类型可以使用enum关键字定义在.proto文件中: enum Age{ male=1; female=2; } 到此 Protobuf 属性解释介绍完成。
  • Grpc请求体报文解析:传输协议使用http2.0, 自然会对一些头部信息做压缩。 【包头】部信息有 Path:例如 “/demo.GRPCDemo/SimpleMethod”。 通过“/ 包名. 服务名 / 方法名”的形式确定了 RPC 方法 content-type ...
  • Google Protobuffer C#

    2018-10-28 23:33:56
    可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。 或许您和我一样,在第一次看完这些介绍后还是不明白 Protobuf 究竟是什么,...
  • 在Unity中使用ProtoBuffer进行数值表转换以及生成网络通信用的协议,工程中使用了https://github.com/jameyli/tnt/tree/master/python中的xls转表工具
  • 大平台(兼有pc和mobile),比如阿里/百度/腾讯目前都以protobuffer作为数据交换格式. 我所知道的纯移动流量平台mongo和小米,采用的json. 不能明白他们做选择时的考量是什么, 所以对两者做了简单的对比测试(当然,不...
  • protobuffer 2017-11-2最新版,google 通信协议,节省流量,使用方便
  • ToLua集成Protobuffer3

    2020-04-10 17:10:43
    协议的处理在lua,所有数据都是通过C#的socket转发到lua,lua最后解密, 需要环境: Unity环境: 2018.1.0b11(64bit) protobuf环境:protobuf3.3 你需要点击:Assets\LuaFramework\LuaProject\Scene\Start才能...
  • 消息被使用了,字段就不能改了,改了会造成数据错乱(常见坑),服务器和客户端很多bug,是proto buffer 文件更改,未使用更改后的协议导致。 1 到 15 范围内的字段编号需要一个字节进行编码,编码结果将同时包含...
  • php中使用protobuffer

    2021-04-21 01:35:34
    Protobuf 简介protobuf(Protocol buffers)是谷歌出品的跨平台、跨语言、可扩展的数据传输及存储的协议,是高效的数据压缩编码方式之一。Protocol buffers 在序列化数据方面,它是灵活的,高效的。相比于 XML 来说,...
  • protobuffer简介

    千次阅读 2019-02-27 11:35:44
    1、什么是protocol buffers ... protocol buffers是一个灵活的、高效的、自动化的用于对结构化数据进行序列化的协议,与json、xml相比,protocol buffers序列化后的码流更小、速度更快、操作更简单。你...
  • 与json xml一样,protobuf格式的数据,也是数据传输常用格式,基于加密效率更高,所以说protubuf是一个数据协议,此数据协议的安装和使用过程如下: 1.安装,先安装protobuf包,这是c语言写的,再安装go语言操作...
  • 协议缓冲区-Google的数据交换格式 版权所有2008 Google Inc.。 C ++安装-Unix 如果从github获取源代码,则需要首先生成configure脚本: $ ./autogen.sh 这会将gtest源(用于C ++协议缓冲区单元测试)下载到当前...
  • 重新实现的协议缓冲区示例
  • protobuffer学习总结

    万次阅读 2019-04-03 12:49:38
    一般用于数据存储以及通信协议方面。 如果是第一次使用protobuffer,我们可以将其与json或者xml进行类比,其实它与json或xml类似都可以作为数据的存储方式,不同的是json和xml是文本格式,而protobuffer是二进...
  • 知识基础 6.1 网络通信协议 序列化 & 反序列化 属于通讯协议的一部分 通讯协议采用分层模型:TCP/IP模型(四层) & OSI 模型 (七层) 序列化 / 反序列化 属于 TCP/IP模型 应用层 和 OSI`模型 展示层的主要功能: ...
  • 准备工具:工具下载地址如下:https://github.com/protocolbuffers/protobuf/releases/tag/v3.6.1,主要使用到的文件有:protoc.exe工具:通过此工具将从自定义的协议文件(.proto)得到相应(.java)的Java类文件;...
  • ProtoBuffer笔记

    2020-10-20 10:18:54
    Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。 为什么要使用Protobuf [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VAUA04...
  • 原立面 ... 已安装协议 运行: lein protobuf构建原型类 从Clojure ( use 'proto-facade.core :reload ) ( import 'test.Data$Person) ( def p ( -> ( Data$Person/newBuilder ) ( .setName " hi
  • Protobuf: 一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议和数据存储等领域;
  • Protobuffer教程

    2018-12-08 14:46:00
    什么是protobufferprotobuffer是如何工作的? 为什么不用xml? 1.什么是protobufferprotobuffer是一种灵活,高效,自动化的机制,用于序列化结构化数据 - 想想XML,但更小,更快,更简单。您可以定义...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,266
精华内容 506
关键字:

protobuffer协议