电脑多网卡模式下,使用特定网口发送HTTP请求的代码实现(HttpClient5.1)

本文介绍如何通过重写HttpClient5的DefaultRoutePlanner.determineLocalAddress方法来指定本地IP地址,从而实现在多网卡环境下从特定网卡发送HTTP请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

前面我们讲了使用基于HttpClient和Socket两种方式处理多网卡模式下的绑定本地网卡发送请求的代码实现,现在讲一下重写HttpClient5实现本地网卡绑定实现方法。


解决方案:

基于HttpClient5.1:

关键代码,重写DefaultRoutePlanner.determineLocalAddress 方法,加入需绑定的本地IP。

代码如下:

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.DefaultSchemePortResolver;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.impl.routing.DefaultRoutePlanner;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.ParseException;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.apache.hc.core5.http.protocol.HttpContext;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.net.InetAddress;

@Slf4j
public class HttpClient5Test {

    @Test
    void httpClient5Connect() {
        String localAddress = "192.168.2.103";
        String[] ipStr = localAddress.split("\\.");
        byte[] localAddressByte = new byte[4];
        for (int i = 0; i < 4; i++) {
            localAddressByte[i] = (byte) (Integer.parseInt(ipStr[i]) & 0xff);
        }
        RequestConfig config = RequestConfig.custom().build();
        HttpGet httpGet = new HttpGet("http://192.168.2.1/");
        httpGet.setConfig(config);
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        // 关键代码,重写DefaultRoutePlanner.determineLocalAddress 方法,加入需绑定的本地IP
        httpClientBuilder.setRoutePlanner(new DefaultRoutePlanner(DefaultSchemePortResolver.INSTANCE) {
            @SneakyThrows
            @Override
            protected InetAddress determineLocalAddress(final HttpHost firstHop, final HttpContext context) {
                return InetAddress.getByAddress(localAddressByte);
            }
        });
        try (CloseableHttpClient httpClient = httpClientBuilder.build()) {
            CloseableHttpResponse response = httpClient.execute(httpGet);
            String body = EntityUtils.toString(response.getEntity(), "UTF-8");
            log.info(body);
            // TODO 获取页面内容实现
        } catch (IOException | ParseException e) {
            e.printStackTrace();
        }
    }
}


快速导航:

电脑多网卡模式下,使用特定网口发送HTTP请求的代码实现(HttpClient4、Socket)
电脑多网卡模式下,使用特定网口发送HTTP请求的代码实现(WebMagic)
电脑多网卡模式下,使用特定网口发送HTTP请求的代码实现(HttpClient5)

总结:

遇到问题不要怕,总能找到解决问题的办法。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码觉客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值