前言:
前面我们讲了使用基于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)
总结:
遇到问题不要怕,总能找到解决问题的办法。