ICE的消息编码规则

来源:互联网 发布:野村周平水原希子 知乎 编辑:程序博客网 时间:2024/05/18 13:45
1、代表size的长度字段:
   值小于255用1个字节标示,如果大于255则使用5个字节,第一个字节为255,后续的4个字节标示真实长度
2、基本数据类型按照小端序进行实际长度编码
3、字符串被编码成size加utf-8的实际内容,注意不包含结束字符  
4、sequence被编码成size加实际元素编码
5、枚举值被按照元素个数来进行字节编码,枚举的第一个元素取值被编码成0
   如果枚举元素个数小于128个,那么使用一个字节,小于32768则使用2个字节,否则使用4个字节
6、结构按照成员顺序进行编码
7、异常被按照如下的顺序进行编码:bool + (异常名 + 异常长度 + 异常内容)... + 类编码
   (异常名 + 异常长度 + 异常内容)部分按照先子类异常后基类异常的方式进行编码
8、类的编码按照如下顺序进行:实例编号+(类名标示+类名/类编号+类长度+类内容)...
   类名标示如果为0,则使用类名、否则使用类索引,按照类名出现的顺序从1开始编号
   (类名标示+类名/类编号+类长度+类内容)按照先子类后基类方式编码,注意最后肯定有object基类
9、当碰到指针需要进行编码时,指针使用的实例编号为所指向实例的负值
10、代理被按照如下的方式进行编码:ID + facet + mode + secure + endpoints/adapterid
11、ICE使用如下5类消息:
    A、请求消息(messageType:0)
    struct RequestData 
    {
        int requestId;                  // 请求序列号,和应答匹配,0标示单向调用无应答
        Ice::Identity id;               // 对象标示
        Ice::StringSeq facet;           // facet名称
        string operation;               // 操作标示
        byte mode;                      // 调用模式(0=normal, 2=idempotent)
        Ice::Context context;           // 上下文
        Encapsulation params;           // 输入参数
    };
    B、批量请求消息(messageType:1)
    struct BatchRequestData 
    {
        Ice::Identity id;
        Ice::StringSeq facet;
        string operation;
        byte mode;
        Ice::Context context;
        Encapsulation params;
    };
    C、应答消息(messageType:2)
    struct ReplyData 
    {
        int requestId;
        byte replyStatus;    // 0:成功 用户异常1 对象不存在2 facet不存在3 操作部存在4  未知本地异常5  未知用户异常6 未知异常7
        Encapsulation body;
    };
    D、验证连接消息(messageType:3)
    E、关闭连接消息(messageType:4)
12、所有类型消息的公共消息头部分结构如下:
    struct HeaderData 
    {
        int magic;                  // 固定:IceP
        byte protocolMajor;         // 版本号
        byte protocolMinor;
        byte encodingMajor;
        byte encodingMinor;
        byte messageType;           // 消息类型
        byte compressionStatus;     // 压缩标记 0:未压缩  1:未压缩但可以接受压缩应答 2:已压缩可以接受压缩应答
        int messageSize;            // 消息长度
    };
13、小于100个字节的消息是不会进行压缩处理的   
原创粉丝点击