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 地址 的相关文章

  • 重构——套接字中的良好实践——简单的服务器-客户端 Swing 应用程序

    我使用单例和观察者模式编写了一个带有 Swing 接口的简单服务器 客户端程序 每个客户端都连接到服务器并可以发送消息 服务器将其收到的消息转发给其余的客户端 客户端使用 GUI 允许它们随时连接和断开与服务器的连接 该程序运行得很好 因为
  • java中队列的实现

    在 Java 中实现队列是一个非常常见的面试问题 我在网上冲浪 看到了许多实现 他们做了一些奇特的事情 比如实现队列接口和编写自己的addLast and removeFirst 方法 我的问题是我不能使用LinkedList 类并使用其预
  • 用于防止滥用的 Servlet 过滤器? (DoS、垃圾邮件等)

    我正在寻找一个 Servlet 过滤器库 它可以帮助我保护我们的 Web 服务免受未经授权的使用和 DDoS 攻击 我们的网络服务有 授权客户 因此理想情况下 过滤器将帮助检测未经授权或行为不当的客户 或检测使用同一帐户的多个人 此外 我们
  • 中间件 API 的最佳实践是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们正在开发一个中间件 SDK 采用 C 和 Java 语言 供游戏开发人员 动画软件开发人员 阿凡达开
  • Scala(或 Java)中泛型函数的特化

    是否可以在 Scala 中专门化泛型函数 或类 例如 我想编写一个将数据写入 ByteBuffer 的通用函数 def writeData T buffer ByteBuffer data T buffer put data 但由于 put
  • 如何在命令提示符中检查 JAVA_OPTS 值?

    我们的应用程序部署 JBoss 服务器然后抛出错误 PermGen space 然后在 jboss bat 和配置文件中设置 permgen 变量中的 java OPTS JAVA OPTs 中是否有值 assige 如何检查 如何在命令提
  • 如何获取 Android 中临时文件的文件大小?

    如果我使用 openFileOutput 创建并写入临时文件 写入完成后如何获取文件大小 我希望这可以帮助你 File file new File selectedPath int file size Integer parseInt St
  • 尝试在空对象引用上调用虚拟方法“java.lang.String org.jsoup.nodes.Element.ownText()”

    我正在使用下面的代码来获取版本名称 from 应用商店通过使用 jsoup 我正在获取详细信息 但它引发了一些异常 我的代码是 public class ForceUpdateAsync extends AsyncTask
  • python:numpy 运行脚本两次

    当我将 numpy 导入到 python 脚本中时 该脚本会执行两次 有人可以告诉我如何阻止这种情况 因为我的脚本中的所有内容都需要两倍的时间 这是一个例子 usr bin python2 from numpy import print t
  • Hibernate @OneToMany 注释到底是如何工作的?

    我对 Hibernate 还很陌生 我正在通过教程学习它 我在理解到底如何一对多注释作品 所以我有这两个实体类 Student代表一个学生并且Guide代表指导学生的人 因此 每个学生都与一名向导相关联 但一名向导可以跟随多个学生 我想要一
  • 如何在 Java 中创建要打印到 JFrame 的 JLabels 数组

    我正在尝试制作一系列标签 每个标签都有一个来自函数的不同值 我不知道要使用的标签的确切数量 我的意思是可以打印任意数量的值 请帮我做这件事 很简单 只需一个方法返回一个数组或一些 JLabels 集合 并将它们全部添加到您的 JCompon
  • Java 8根据Map属性过滤Map对象列表以删除一些重复项

    Have a List
  • 如何将任务添加到 gradle 中的主要“构建”任务

    当我尝试使用以下代码将任务添加到主构建任务时 rootProject tasks getByName build dependsOn mytask 当我跑步时它抱怨gradle w build输出 Where Build file line
  • Jenkins 管道和 java.nio.file.* 方法的问题

    我正在尝试使用 java nio file 中的方法在 Jenkins 管道中执行一些基本文件操作 无论代码存在于哪个节点块中 代码都在主节点上执行 在管道中 我已经验证了各个节点块都是正确的 它们唯一地标识了特定的节点 但是 pathEx
  • 无法在 BlackBerry Playbook 上设置音量

    我在更改黑莓游戏书的音量时遇到问题 首先 我将 Android 应用程序重新打包到 Palybook 应用程序 我需要使用搜索栏更改黑莓剧本的音量 并在搜索监听器中设置音频管理器音量 这是代码 audioManager AudioManag
  • JPA - 非主键字段上的 @OneToOne 关系不起作用

    我有一个 Spring Data JPA 后端 使用 Hibernate 作为 ORM 实现 这是模型 Person MailConfig id PK uid PK FK Person uid uid Entity
  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • SWT - 与操作系统无关的获取等宽字体的方法

    SWT 有没有一种方法可以简单地获得跨各种操作系统的等宽字体 例如 这适用于 Linux 但不适用于 Windows Font mono new Font parent getDisplay Mono 10 SWT NONE 或者我是否需要
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • java中的回调是什么[重复]

    这个问题在这里已经有答案了 可能的重复 什么是回调函数 https stackoverflow com questions 824234 what is a callback function 我已经阅读了回调的维基百科定义 但我仍然没有明

随机推荐

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

    我和一位同事正在从事共享一些模型的不同项目 因此 我们通过 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 此外 我将在池上循环 每次使