前言
该拦截器的作用就是使用上一个ConnectInterceptor
开辟的I/O窗口,通过这个窗口向Socket管道内读取/写入数据。然后将服务器的响应构建为一个Response返回,最后根据Connection
头信息判断需不需要关闭连接
过程
- 如果该请求带有
Body
,则会检测请求中有没有Expect:100-continue
头信息,如果有则仅仅发送头信息,待服务器返回响应确认可以发送body
后,才会接着发送body
- 判断需不需要分块发送
- 读取响应,构建Response
- 判断需不需要关闭连接
问题
- Socket管道什么打开的,什么时候关闭的?
Socket管道在新建连接时(
ConnectionInterceptor
)打开,在清理连接池(RealConnectionPool)时,如果Socket超过限制的时长,就会被关闭。会有一个专门的线程(线程池中获取)负责清理工作。当连接池中的第一个连接被创建时,这个线程就被创建了。注意,并不是在CallServerInterceptor
中关闭的,CallServerInterceptor
只是标示了当前的连接不能再开辟I/O窗口,等待被清理