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

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

做人第一,做学问第二。
原文地址:https://www.cnblogs.com/xumaojun/p/8526530.html