2009-10-17 59 views
3

我试图找到一种方法来强制Jar通过我的代理服务器(在本地主机上运行)(也是Java应用程序)对外部IP进行的任何连接尝试。 一旦代理服务器接收到连接,它将打开与外部IP的连接并开始将IO与客户机/服务器进行路由。启动选项以强制Java套接字连接到本地主机?

我一直在谷歌搜索这2天,我没有任何运气,我相信我在我的搜索尝试中使用错误的条款。

如果您有任何想法,请让我知道,我会尝试任何。

在此先感谢。 - 肖恩。

+0

同样在这里讨论:http://stackoverflow.com/questions/1432961/how-do-i-make-httpurlconnection-use-a-proxy – 2010-03-04 20:14:27

回答

4

如果是一个“真正的”代理的,你可以指定代理使用JA使用VA系统属性。

你有两种选择:

  1. 指定命令行代理
  2. 硬编码到您的应用程序

那么你实际上有三个

  • 指定一个.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可从classpath

    有关此功能的更多信息here

    1

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

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

    这项工作是因为HTTP和FTP协议专门支持代理。例如,HTTP GET请求消息的第一行'给出了客户端请求的页面的完整URL。如果GET请求进入代理,代理可以找出需要发送的地址。

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

    所以,如果你是真的询问大约代理Java应用程序的网络流量都,这只能在JVM之外执行;即在JVM(物理或虚拟)主机操作系统的网络传输级别上。

    +0

    我不完全同意这一点。自Java 1.5以来,内置对SOCKS代理的支持(请参阅'java.net.Socket(代理代理)'的构造函数)。但是,是的,对于HTTP协议,需要一些额外的层来处理它。 Apache'commons-httpclient'开发人员承诺在4.x版本的库中添加此支持(请参阅http://wiki.apache.org/HttpComponents/FrequentlyAskedApplicationDesignQuestions#Proxy_Configuration)。 – 2010-03-04 20:05:07

    +0

    并且...是...有完整的代理支持(至少在Java 6中以及HTTP和FTP)。参见'sun.net.www.protocol.ftp.FtpURLConnection#connect()'和'sun.net.www.protocol.http.HttpURLConnection#plainConnect()'。另外支持身份验证。 – 2010-03-04 20:12:51