• 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框架使用)

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

    做人第一,做学问第二。
  • 相关阅读:
    第三方驱动备份与还原
    Greenplum 解决 gpstop -u 指令报错
    yum安装(卸载)本地rpm包的方法(卸载本地安装的greenplum 5.19.rpm)
    Java JUC(java.util.concurrent工具包)
    netty 详解(八)基于 Netty 模拟实现 RPC
    netty 详解(七)netty 自定义协议解决 TCP 粘包和拆包
    netty 详解(六)netty 自定义编码解码器
    netty 详解(五)netty 使用 protobuf 序列化
    netty 详解(四)netty 开发 WebSocket 长连接程序
    netty 详解(三)netty 心跳检测机制案例
  • 原文地址:https://www.cnblogs.com/xumaojun/p/8526530.html
Copyright © 2020-2023  润新知