zoukankan      html  css  js  c++  java
  • Thrift源码解析--transport

    这一层主要是用于实现网络通信,现在都是基于Tcp/Ip,而Tcp/Ip协议栈由socket来实现,换句话说就是现在网络通信服务底层大都是通过socket实现的,在thrift源码中,就是将socket包装成各种transport来使用。

    TTransport:这是一个基类,并且是一个抽象类。

    TIOStreamTransport继承TTransport类,是最常用的base transport, It takes an InputStream and an OutputStream and uses those to perform all transport operations.主要是由inputStream和OutputStream进行读写操作,主要有open,close,read,write,flush等方法。代码如下:

      1 public class TIOStreamTransport extends TTransport {
      2 
      3   private static final Logger LOGGER = LoggerFactory.getLogger(TIOStreamTransport.class.getName());
      4 
      5   /** Underlying inputStream */
      6   protected InputStream inputStream_ = null;
      7 
      8   /** Underlying outputStream */
      9   protected OutputStream outputStream_ = null;
     10 
     11   /**
     12    * Subclasses can invoke the default constructor and then assign the input
     13    * streams in the open method.
     14    */
     15   protected TIOStreamTransport() {}
     16 
     17   /**
     18    * Input stream constructor.
     19    *
     20    * @param is Input stream to read from
     21    */
     22   public TIOStreamTransport(InputStream is) {
     23     inputStream_ = is;
     24   }
     25 
     26   /**
     27    * Output stream constructor.
     28    *
     29    * @param os Output stream to read from
     30    */
     31   public TIOStreamTransport(OutputStream os) {
     32     outputStream_ = os;
     33   }
     34 
     35   /**
     36    * Two-way stream constructor.
     37    *
     38    * @param is Input stream to read from
     39    * @param os Output stream to read from
     40    */
     41   public TIOStreamTransport(InputStream is, OutputStream os) {
     42     inputStream_ = is;
     43     outputStream_ = os;
     44   }
     45 
     46   /**
     47    * The streams must already be open at construction time, so this should
     48    * always return true.
     49    *
     50    * @return true
     51    */
     52   public boolean isOpen() {
     53     return true;
     54   }
     55 
     56   /**
     57    * The streams must already be open. This method does nothing.
     58    */
     59   public void open() throws TTransportException {}
     60 
     61   /**
     62    * Closes both the input and output streams.
     63    */
     64   public void close() {
     65     if (inputStream_ != null) {
     66       try {
     67         inputStream_.close();
     68       } catch (IOException iox) {
     69         LOGGER.warn("Error closing input stream.", iox);
     70       }
     71       inputStream_ = null;
     72     }
     73     if (outputStream_ != null) {
     74       try {
     75         outputStream_.close();
     76       } catch (IOException iox) {
     77         LOGGER.warn("Error closing output stream.", iox);
     78       }
     79       outputStream_ = null;
     80     }
     81   }
     82 
     83   /**
     84    * Reads from the underlying input stream if not null.
     85    */
     86   public int read(byte[] buf, int off, int len) throws TTransportException {
     87     if (inputStream_ == null) {
     88       throw new TTransportException(TTransportException.NOT_OPEN, "Cannot read from null inputStream");
     89     }
     90     int bytesRead;
     91     try {
     92       bytesRead = inputStream_.read(buf, off, len);
     93     } catch (IOException iox) {
     94       throw new TTransportException(TTransportException.UNKNOWN, iox);
     95     }
     96     if (bytesRead < 0) {
     97       throw new TTransportException(TTransportException.END_OF_FILE);
     98     }
     99     return bytesRead;
    100   }
    101 
    102   /**
    103    * Writes to the underlying output stream if not null.
    104    */
    105   public void write(byte[] buf, int off, int len) throws TTransportException {
    106     if (outputStream_ == null) {
    107       throw new TTransportException(TTransportException.NOT_OPEN, "Cannot write to null outputStream");
    108     }
    109     try {
    110       outputStream_.write(buf, off, len);
    111     } catch (IOException iox) {
    112       throw new TTransportException(TTransportException.UNKNOWN, iox);
    113     }
    114   }
    115 
    116   /**
    117    * Flushes the underlying output stream if not null.
    118    */
    119   public void flush() throws TTransportException {
    120     if (outputStream_ == null) {
    121       throw new TTransportException(TTransportException.NOT_OPEN, "Cannot flush null outputStream");
    122     }
    123     try {
    124       outputStream_.flush();
    125     } catch (IOException iox) {
    126       throw new TTransportException(TTransportException.UNKNOWN, iox);
    127     }
    128   }
    129 }

    TSocket继承了TIOStreamTransport类,封装了Socket接口,含有host,port,socket,timeout几个私有变量,并且有open,isOpen,initSocket,getSocket,setTimeout方法,由于继承自TIOStreamTransport,因此父类的读写方法都可以使用,也就是说TSocket的通信根本还是使用的输入输出流。

     TserverSocket继承自TserverTransport,

    TNoblockingServerTransport继承自TserverTransport,

    TNoblockingServerSocket继承自TNoblockingServerTransport

    图中的XoaServerTransport暂时忽略(公司内部xoa框架使用)

    以上是用于服务端,而客户端则如右下图所示,不再赘述。

  • 相关阅读:
    推荐系统 蒋凡译 第一章 引言 读书笔记
    神经网络与深度学习 邱锡鹏 第5章 卷积神经网络 读书笔记
    神经网络与深度学习 邱锡鹏 第4章 前馈神经网络 读书笔记
    神经网络与深度学习 邱锡鹏 第3章 线性模型 读书笔记
    神经网络与深度学习 邱锡鹏 第2章 机器学习概述 读书笔记
    神经网络与深度学习 邱锡鹏 第1章 绪论 作业
    神经网络与深度学习 邱锡鹏 第1章 绪论 读书笔记
    算法笔记 上机训练实战指南 第13章 专题扩展 学习笔记
    算法笔记 第13章 专题扩展 学习笔记
    算法笔记 上机训练实战指南 第11章 提高篇(5)--动态规划专题 学习笔记
  • 原文地址:https://www.cnblogs.com/leehfly/p/4939728.html
Copyright © 2011-2022 走看看