美文网首页
httpclient 发送http请求过程

httpclient 发送http请求过程

作者: futureluck | 来源:发表于2018-11-20 11:30 被阅读0次

    socket建立示例

    http请求是在应用层,建立在tcp/ip之上,httpclient的实现也是建立在socket操作上的,先看socket客户端发送消息示例:

    // 1.建立端到端的连接
    Socket socket = new Socket("127.0.0.1", 8080);
    // 2.往输出流发送字节
    OutputStream outputStream = socket.getOutputStream();
    outputStream.write(1);
    // 3.往输入流读取字节
    InputStream inputStream = socket.getInputStream();
    inputStream.read();
    

    httpclient建立连接

    httpclient就是把上述示例封装,先实例化PoolingHttpClientConnectionManager 构造函数默认传入DefaultHttpClientConnectionOperator实例,然后每次执行发送请求,先执行连接过程。

    // 1.dns解析
    // 2.解析端口,ip 建立连接
    // 3.将建立的连接的socket对象赋值给conn对象
    // 4.conn对象write数据,其实操作的就是socket的outputStream 对象
    // 5.conn对象读取数据,其实操作的就是socket的inputStream对象
    @Override
    public void connect(
            final ManagedHttpClientConnection conn,
            final HttpHost host,
            final InetSocketAddress localAddress,
            final int connectTimeout,
            final SocketConfig socketConfig,
            final HttpContext context) throws IOException {
        final Lookup<ConnectionSocketFactory> registry = getSocketFactoryRegistry(context);
        final ConnectionSocketFactory sf = registry.lookup(host.getSchemeName());
    
        final InetAddress[] addresses = host.getAddress() != null ?new InetAddress[] { host.getAddress() } :   
        this.dnsResolver.resolve(host.getHostName());
        final int port = this.schemePortResolver.resolve(host);
        for (int i = 0; i < addresses.length; i++) {
            final InetAddress address = addresses[i];
            final boolean last = i == addresses.length - 1;
    
            Socket sock = sf.createSocket(context);
            sock.setSoTimeout(socketConfig.getSoTimeout());
            sock.setReuseAddress(socketConfig.isSoReuseAddress());
            sock.setTcpNoDelay(socketConfig.isTcpNoDelay());
            sock.setKeepAlive(socketConfig.isSoKeepAlive());
            final int linger = socketConfig.getSoLinger();
            if (linger >= 0) {
                sock.setSoLinger(true, linger);
            }
            conn.bind(sock);
    
            final InetSocketAddress remoteAddress = new InetSocketAddress(address, port);
            try {
                sock = sf.connectSocket(connectTimeout, sock, host, remoteAddress, localAddress, context);
                conn.bind(sock);
                if (this.log.isDebugEnabled()) {
                    this.log.debug("Connection established " + conn);
                }
                return;
            } catch (final SocketTimeoutException ex) {
                if (last) {
                    throw new ConnectTimeoutException(ex, host, addresses);
                }
            } 
        }
    }
    

    相关文章

      网友评论

          本文标题:httpclient 发送http请求过程

          本文链接:https://www.haomeiwen.com/subject/ofmtqqtx.html