【问题标题】:Launch options to force Java socket connections to localhost?启动选项以强制 Java 套接字连接到本地主机?
【发布时间】:2010-12-07 13:36:17
【问题描述】:

我正在尝试找到一种方法来强制 Jar 通过我的代理服务器对外部 IP 进行任何连接尝试,该代理服务器在 localhost(也是 Java 应用程序)上运行。 一旦代理服务器收到连接,它将打开与外部 IP 的连接并开始将 IO 路由到客户端/服务器。

我在谷歌上搜索了 2 天,但运气不佳,我认为我在搜索尝试中使用了错误的术语。

如果你有任何想法,请告诉我,我会尝试任何事情。

提前致谢。 - 肖恩。

【问题讨论】:

标签: java proxy localhost


【解决方案1】:

如果这是一个“真正的”代理,您可以使用 java 系统属性指定要使用的代理。

你有两种选择:

  1. 在命令行中指定代理
  2. 将其硬编码到您的应用中

其实你有三个

  1. 指定一个 .properties 文件,从那里读取,并将其设置为系统属性(这几乎是选项 2,但更动态)

您将使用命令行:

 java -Dhttp.proxyHost=localhost -Dhttp.proxyPort=8080 -jar YourJar.jar

这样,您执行的所有 http 连接都将通过 localhost 端口 8080

第二个是在程序的 main 方法中添加:

public static void main( String [] args ) { 
    System.setProperty("http.proxyHost", "localhost");
    System.setProperty("http.proxyPort", "8080");
    .....
}

哪个也一样。

终于从myapp.properties加载

public static void main( String [] args ) { 
    try { // there are cleaner ways of course 
        ResorceBundle bundle = ResourceBundle.getBundle("myapp");
        System.setProperty("http.proxyHost", bundle.getString("proxy.server"));
        System.setProperty("http.proxyPort", bundle.getString("proxy.port"));
    } catch( MissingResourceException missingResourceException ){}
    ....
}

您只需要确保 myapp.properties 可从类路径获得

有关此功能的更多信息here

【讨论】:

    【解决方案2】:

    如果您询问的是 Socket 连接的一般(不是 HTTP / FTP 特定的!)代理,那么简单的答案是 Java 不支持它。

    当您为 HTTP 和 FTP 流量配置代理时,代理会在应用程序协议级别进行。 Java 端代理属性告诉 URLConnection 层连接到您指定的代理,而不是应用程序尝试连接的 URL 中的 IP 地址。 Java Socket 级别不知道这种情况正在发生。它只是看到一个连接到代理的请求。

    这是因为 HTTP 和 FTP 协议专门支持代理。例如,HTTP GET 请求消息的第一行给出了客户端请求的页面的完整 URL。如果 GET 请求发送到代理,代理可以确定必须将其发送到哪里。

    看 Socket 级别的代理问题,第一个观察是标准的 Java 类库不支持这个。第二个观察结果是它实际上是无法实现的……除非您将其实现为替代传输层。原因是 IP 和 TCP/IP 根本不支持显式代理或中继消息/流的概念。即使您确实实现了这样的传输,它也不适合标准的 Socket 模型。

    所以,如果您真的询问为 Java 应用程序代理所有的网络流量,这只能在 JVM 之外实现;即在 JVM(物理或虚拟)主机操作系统的网络传输级别。

    【讨论】:

    • 我并不完全同意这一点。从 Java 1.5 开始,内置了对 SOCKS 代理的支持(请参阅java.net.Socket(Proxy proxy) 构造函数)。但是,是的,对于 HTTP 协议,需要一些额外的层来处理它。 Apache commons-httpclient 开发人员承诺在 4.x 版本的库中添加此支持(请参阅 wiki.apache.org/HttpComponents/…)。
    • 而且...是的...有完整的代理支持(至少在 Java 6 和 HTTP 和 FTP 中)。请参阅 sun.net.www.protocol.ftp.FtpURLConnection#connect()sun.net.www.protocol.http.HttpURLConnection#plainConnect()。加上对身份验证的支持。
    【解决方案3】:

    如果是 HTTP 流量或 FTP 流量,您可以尝试以下系统属性:

    http.proxyHost (默认: ) http.proxyPort(默认值:如果指定了 http.proxyHost,则为 80) http.nonProxyHosts(默认:

    查看此链接了解详情:

    http://java.sun.com/docs/books/tutorial/networking/urls/_setProxy.html

    【讨论】:

      猜你喜欢
      • 2017-11-07
      • 2016-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2010-09-11
      • 2016-12-06
      相关资源
      最近更新 更多