JAVA:如何创建 http url 连接选择要使用的 IP 地址

2024-03-25

我在多个 NIC 上配置了一个公共 IP 地址池。 在我的 JAVA 项目中,该项目在 LINUX 计算机上运行,​​我需要从池中选择一个特定的 IP 地址,并使用该 IP 创建一个 HttpURLConnecion。此外,我将在池上循环,每次使用不同的 ip。

在现阶段,我无法找到使用 java.net 库的解决方案。我更关注的是 Apache 的 HttpClient。在以下链接中,http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html,据说这样的库可以支持我正在寻找的功能。有关此问题的讨论可以在以下位置找到:使用 Apache HttpClient 定义源 IP 地址 https://stackoverflow.com/questions/8213714/define-source-ip-address-using-apache-httpclient。实际上,发布的线程似乎不是结论性的,因为用户的体验与所描述的库的使用形成鲜明对比。

因此,我不认为SO社区真正成功地解决了这个问题。事实上,在 SO 上可以找到关于这个主题的几个重播的问题/答案,但似乎没有一个对问题进行详尽的分析。

此外,使用 java.net 库(如在我的项目中)根本不会遇到问题。

目前,我可能的选择是调用一些 LINUX 系统命令(来自 java)来切换用于当前连接的 NIC。不过,我还没有弄清楚。

因此,如果任何在解决此问题方面有积极经验的用户能够向我提出解决方案/想法/方法,我将不胜感激。

提前致谢,

Marcello

UPDATE:

我目前已经实现了这个测试代码。它给了我正确的状态代码(200)。不过需要用多个ip地址进行测试。

public class test {

    public static void main(String[] args) {

        final String authUser = "admin";
        final String authPassword = "password";
        Authenticator.setDefault(
           new Authenticator() {
              public PasswordAuthentication getPasswordAuthentication() {
                 return new PasswordAuthentication(
                       authUser, authPassword.toCharArray());
              }
           }
        );

        System.setProperty("http.proxyUser", authUser);
        System.setProperty("http.proxyPassword", authPassword);

        try {

            Properties systemProperties = System.getProperties();
            URL url = new URL("yourURL");
            systemProperties.setProperty("http.proxyHost","localhost");
            systemProperties.setProperty("http.proxyPort", "8080");                         

            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            int status = connection.getResponseCode();
            System.out.println(status);

        } catch (IOException e) {
            System.out.println("connection problems");
        }
    }

}

此时,您应该能够配置与每个网卡相关的不同 TCP 端口。有人尝试过这样的事情吗? 我期待阅读新的想法/评论。

更新2:准确地说,我已经为那些需要它的人提供了身份验证设置。


为什么不直接使用 org.apache.httpcomponents 呢?

这是一个有效的示例(使用 Maven 插件 org.apache.httpcomponents,版本 4.3.1):

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

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class HttpClientExample {

    public void gogo() throws ClientProtocolException, IOException {

        CloseableHttpClient httpclient = HttpClients.createDefault();

        // Local interface1:
        byte ip1[] = new byte[] { (byte)192, (byte)168, (byte)100, (byte)32 };
        // Local interface2:
        byte ip2[] = new byte[] { (byte)192, (byte)168, (byte)100, (byte)33 };


        RequestConfig requestConfig = RequestConfig.custom().setLocalAddress(InetAddress.getByAddress(ip1)).build();
        try {
            HttpGet httpget = new HttpGet("http://server.com");
            httpget.setConfig(requestConfig);
            System.out.println("executing request" + httpget.getRequestLine());
            StringBuilder response = httpclient.execute(httpget,handler);
            System.out.println(response.toString());

            requestConfig = RequestConfig.custom().setLocalAddress(InetAddress.getByAddress(ip2)).build();
            httpget = new HttpGet("http://server.com");
            httpget.setConfig(requestConfig);
            System.out.println("executing request" + httpget.getRequestLine());
            response = httpclient.execute(httpget,handler);
            System.out.println(response.toString());
        } finally {
            httpclient.close();
        }
    }

    private final ResponseHandler<StringBuilder> handler = new ResponseHandler<StringBuilder>() {
        @Override
        public StringBuilder handleResponse(final HttpResponse response)
                throws ClientProtocolException, IOException {
            return sortResponse(response);
        }
    };

    private StringBuilder sortResponse(final HttpResponse httpResponse) throws IOException {
        StringBuilder builder = null;

        if (httpResponse != null) {
            switch (httpResponse.getStatusLine().getStatusCode()) {
                case HttpStatus.SC_OK:
                    final HttpEntity entity = httpResponse.getEntity();
                    if (entity != null) {

                        final InputStreamReader instream = new InputStreamReader(entity.getContent());
                        try {
                            final BufferedReader reader = new BufferedReader(instream);
                            builder = new StringBuilder();
                            String currentLine = null;
                            currentLine = reader.readLine();
                            while (currentLine != null) {
                                builder.append(currentLine).append("\n");
                                currentLine = reader.readLine();
                            }
                        } finally {
                            instream.close();
                        }
                    }
                    break;
                default:
                    throw new IllegalArgumentException("Error.");
            }
        }
        return builder;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA:如何创建 http url 连接选择要使用的 IP 地址 的相关文章

随机推荐

  • 如何配置额外/不同的迁移文件夹

    我和一位同事正在从事共享一些模型的不同项目 因此 我们通过 git 子模块共享模型 此外 我们还希望能够共享迁移 这样 我同事的迁移就会在文件夹中db migrate other db我的项目 如何配置 Rails 迁移以在这个额外文件夹中
  • Rails4 未知编码名称 - CP720

    当我想运行任何 gem 命令时 例如 我收到此错误 gem install rubygems update 错误 while executing gem ArgumentError unknown encoding name CP720 所
  • 自动增量已自动重置回 1

    我刚刚遇到了一个我无法解决的问题 我有一个数据库表project queues它用作队列 我在其中存储一些记录 处理记录后 它们将被删除 删除是由 Rails 构造调用的record destroy在触发的循环中DELETE record
  • WPF:绑定到类内的列表

    我有一个文件类定义如下 public class File public string FileName set get public List
  • 如何在世博会上运行“@apollo/client”

    我有一个裸露的反应本机 然后我将项目转换为expo项目 因为该项目没有与主 React Native 项目一起运行 所以在创建 expo 项目后 我尝试运行该项目 但它给了我这个错误 While trying to resolve modu
  • 在 Fortran 95 中按值传递参数

    如何在调用函数参数时保留其值而不创建新变量 这就是 如何按值传递参数 在此示例代码中 program what implicit none integer a b c d a 1 b 2 c 3 print a b c d f val a
  • varchar 和 int mysql 数据类型的默认值

    屏幕截图显示了数据类型的 3 个典型定义 id 自动增量 标题和数字 1 之间有哪些区别 none and NULL 2 我必须选择吗as defined 当我想要一个空字符串时 对于 varchar 类型 3 我必须放一个as defin
  • 我什么时候应该使用 Response.Redirect(url, true)?

    我正在重定向到一个错误页面 其中包含一条经过美化的错误消息Application Error 在 Global asax 中 目前它说 Response Redirect Error aspx true 应该是 Response Redir
  • MongoDB:cursor.toArray 返回 Promise { }

    情况 我写了一个查询 var results db collection diseases find ttl txt regex data options i toArray Problem 然后我打印了results到控制台 if res
  • VBA 中运行时错误 429,但类已注册

    我正在尝试重新创建一个程序 该程序使用 JavaScript 打开与 PLC 的连接 然后在网页上显示各种信息 由于各种原因 我宁愿将其以 MS Access 的形式保存 并且一直在努力寻找合适的 dll 来使用 Jet32X dll 如果
  • Chrome 中的 HTML5 视频边框半径不起作用

    我试图让我的 HTML5 视频具有透明的左上角和左下角圆角 就像使用 border radius 时的行为一样 不幸的是 在 Chrome 中 由于某种原因 border radius 在 HTML 视频标签上不起作用 但在 IE10 和
  • numpy stride_tricks.as_strided 与滚动窗口的列表理解

    在处理滚动窗口时 我以列表理解的方式编写函数 np std x i i framesize for i in range 0 len x framesize hopsize 最近我发现numpy lib stride tricks as s
  • bash 重命名带有空格的文件时出错 - mv 目标不是目录

    我正在尝试重命名一堆包含空格的文件 去掉空格 我以为我找到了正确的 bash 命令 for f in txt do mv f f done 但是 这会给每个文件带来错误 mv 目标不是目录 如果我在命令中将 mv 替换为 echo mv 它
  • 确定PDF文件中的页数[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要使用 C 代码 NET 2 0 确定指定 PDF 文件的页数 PDF 文件将从文件系统读取 而不是从 URL 读取 有谁知道如何
  • 如何在 Javascript 中格式化时间戳以将其显示在图表中? UTC 没问题

    基本上 我收到原始时间戳 需要将它们格式化为 HH MM SS 格式 这是一个提供灵活的 UTC 日期格式的函数 它接受类似于 Java 的 SimpleDateFormat 的格式字符串 function formatDate date
  • Rails:如何在搜索结果中使用构面

    我有一个铁路应用程序 我正在其中搜索维修店 搜索类方法如下所示 def self search params if params repairshop Repairshop where approved gt true if params
  • 通用 ELF 中的重定位(EM:40)

    我尝试从 Ubuntu 交叉编译到Friendly arm 但出现了奇怪的错误 root kevin VirtualBox home kevin Desktop makef make ARCH arm CROSS COMPILE arm n
  • 无法调用按钮命令:应用程序已被破坏

    下面给出了使用 Tkinter 和 Python 创建独立窗口的代码 import Tkinter Tkinter NoDefaultRoot win1 Tkinter Tk win2 Tkinter Tk Tkinter Button w
  • 连接远程redis服务器

    我想对 redis conf 进行一些更改 以便每当我输入 redis cli 时 它都会将我连接到远程服务器上安装的 redis 我知道我们可以通过以下方式连接到安装在远程服务器上的redis redis cli h IP Address
  • JAVA:如何创建 http url 连接选择要使用的 IP 地址

    我在多个 NIC 上配置了一个公共 IP 地址池 在我的 JAVA 项目中 该项目在 LINUX 计算机上运行 我需要从池中选择一个特定的 IP 地址 并使用该 IP 创建一个 HttpURLConnecion 此外 我将在池上循环 每次使