Thrift源码解析--transport

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

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

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


目录
相关文章
|
10天前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
28 3
|
27天前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
51 5
|
29天前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
|
29天前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
29天前
|
算法 Java 程序员
Map - TreeSet & TreeMap 源码解析
Map - TreeSet & TreeMap 源码解析
32 0
|
29天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
64 0
|
29天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
51 0
|
29天前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
58 0
|
29天前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
74 0
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
377 37

推荐镜像

更多
下一篇
无影云桌面