zoukankan      html  css  js  c++  java
  • libthrift0.9.0解析(三)之TProtocol&TTransport

      

    以上是transport和protocol的类图和结构图。

    transport封装了底层的传输通道,主要有read/write、open/close等基本的读写方法,而且都是对于二进制数据。

    protocol则对应了thrift中的各种数据结构的读写,底层调用transport。

    TIOStreamTransport封装了inputStream和outputStream,TSocket封装了Socket对象,使用了socket的inputStream和outputStream:

     socket_.connect(new InetSocketAddress(host_, port_), timeout_);
     inputStream_ = new BufferedInputStream(socket_.getInputStream(), 1024);
     outputStream_ = new BufferedOutputStream(socket_.getOutputStream(), 1024);
    

     TBinaryProtocol以二进制的形式读写数据,举例如下:

    // 写入整数
    private byte[] i32out = new byte[4];
      public void writeI32(int i32) throws TException {
        i32out[0] = (byte)(0xff & (i32 >> 24));
        i32out[1] = (byte)(0xff & (i32 >> 16));
        i32out[2] = (byte)(0xff & (i32 >> 8));
        i32out[3] = (byte)(0xff & (i32));
        trans_.write(i32out, 0, 4);
      }
    
    // 读取整数
    private byte[] i32rd = new byte[4];
      public int readI32() throws TException {
        byte[] buf = i32rd;
        int off = 0;
    
        if (trans_.getBytesRemainingInBuffer() >= 4) {
          buf = trans_.getBuffer();
          off = trans_.getBufferPosition();
          trans_.consumeBuffer(4);
        } else {
          readAll(i32rd, 0, 4);
        }
        return
          ((buf[off] & 0xff) << 24) |
          ((buf[off+1] & 0xff) << 16) |
          ((buf[off+2] & 0xff) <<  8) |
          ((buf[off+3] & 0xff));
      }
    

     其中的TMessage类型数据代表了包头,name成员描述了函数名称,type成员描述了消息类型,seqid应该是此次对话的唯一id。

  • 相关阅读:
    WebDriverException:Message:'geckodriver'executable needs to be in Path
    如何使用NSDL玩转微信跳一跳
    python多线程下载网页图片并保存至特定目录
    sql之将一个表中的数据注入另一个表中
    sql之分区域分段统计
    sql之分段统计
    ajax二次封装之异步加载
    vue组件之echarts报表
    url查询参数解析
    template.js 数据渲染引擎
  • 原文地址:https://www.cnblogs.com/wuseguang/p/4031417.html
Copyright © 2011-2022 走看看