HttpClient源码解析系列:第三篇:发送-接收的底层过程

本文深入探讨HttpClient的HttpConnection及其派生类,重点在于DefaultBHttpClientConnection,它使用responseParser和requestWriter进行数据交换。请求通过SessionOutputBuffer和SessionInputBuffer在Socket上完成,封装在BHttpConnectionBase中。总结了请求发送的底层细节,展示了一个简洁的核心交互流程。
摘要由CSDN通过智能技术生成

    HttpConnection衍生出来的:

    另外一个我们都知道的是 HttpClientConnection:

    我们先把Connection相关的列出来,暂时不考虑Factory|Pool|Context。实际上,Factory|Pool|Context 列在这里是Intellj IDEA 的工具问题,以HttpConnectionFactory为例:
HttpConnectionFactory<T extends HttpConnection>
    它只是泛型中继承了HttpConnection,HttpConnectionFactory本身并不是从HttpConnection中派生出来的。

    以这两个接口派生出来的接口和类来往下延伸,由于比较多,所以去掉了已经声明为废弃的(每个接口派生出来的都看一遍才能确定)。发现4.3开始,都集中推荐使用DefaultBHttpClientConnection,而它又是继承自BHttpConnectionBase。

    对于DefaultBHttpClientConnection,可以看到非常核心的元素,responseParser 以及 requestWriter。 以及上一节中提到的核心的方法:
this.requestWriter = (requestWriterFactory != null ? requestWriterFactory :
            DefaultHttpRequestWriterFactory.INSTANCE).create(getSessionOutputBuffer());
this.responseParser = (responseParserFactory != null ? responseParserFactory :
            DefaultHttpResponseParserFactory.INSTANCE).create(getSessionInputBuffer(), constraints);

构造方法里给出了 requestWriter 和 responseParser 的构造方式,跟踪到 Factory 中可以看到
实际上两者是基于 SessionOutputBuffer 以及 SessionInputBuffer 的。

看一下核心方法:
AbstractMessageWriter中的:
    @Override
    public void write(final T message) throws IOException, HttpException {
        Args.notNull(message, "HTTP message");
        writeHeadLine(message);
        for (final HeaderIterator it = message.headerIterator(); it.hasNext(); ) {
            final Header header = it.nextHeader();
             this.sessionBuffer.writeLine
                (lineFormatter.formatHeader(this.lineBuf, header));
        }
        this.lineBuf.clear();
         this.sessionBuffer.writeLine(this.lineBuf);
    }

    AbstractMessageParser中的:
    @Override
    public T parse() throws IOException, HttpException {
        final int st = this.state;
        switch (st) {
        case HEAD_LINE:
            try {
                 this.message = parseHead(this.sessionBuffer);
            } catch (final ParseException px) {
                throw new ProtocolException(px.getMessage(), px);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值