IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Thrift源码解析--transport - 笨狗毒毒毒

    笨狗毒毒毒发表于 2015-11-05 08:09:00
    love 0

    这一层主要是用于实现网络通信,现在都是基于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框架使用)

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


    本文链接:Thrift源码解析--transport,转载请注明。



沪ICP备19023445号-2号
友情链接