首先说明一点:我阅读源码一般都不是通篇阅读,而是抓住某一个关键问题,然后一步步跟踪下去,所以阅读源码的过程中会忽略一些我不太关注的部分源码。文章的标题就是此次源码阅读的核心
因为Httclient发起请求的入口是httpClient.execute(httpPost),所以就跟着这个入口进去首先发现的就是InternalHttpClient,里面doExecute()方法是这个类的核心
然后再进一步跟踪下去,发现HttpClient采用了责任链的设计模式,将执行器划分成了若干个执行链路
因为我们的关注点是tcp链接建立的时机及http请求发送的时机,因此其他几个不相关的执行器暂时先不做分析,先来侧重了解一下MainClientExec这个执行器。
execute方法是MainClientExec执行器的核心方法,这里首先向链接池请求一个链接,刚开始我以为是在这里创建的TCP链接,然而抓包结果显示这里并没有(没有发起三次握手),断点一步步往下走,然后在establishRoute这个方法发起了三次握手
链接建立完毕后,接着一步步向下走,直到requestExecutor.execute(request, managedConn, context)执行完毕才发起了http请求,并拿到了response响应信息