启动选项以强制Java套接字连接到本地主机?

启动选项以强制Java套接字连接到本地主机?,java,proxy,localhost,Java,Proxy,Localhost,我试图找到一种方法,通过我的代理服务器,强制Jar尝试连接外部IP,代理服务器运行在localhost(也是一个Java应用程序)上。 一旦代理服务器接收到连接,它将打开与外部IP的连接,并开始在客户端/服务器之间来回路由IO 我已经在谷歌上搜索了2天,但我没有任何运气,我相信我在搜索尝试中使用了错误的术语 如果你有什么想法,请告诉我,我什么都可以试试 提前谢谢Sean.如果是HTTP流量或FTP流量,您可以尝试以下系统属性: http.proxyHost(默认值:) http.proxyPor

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

我已经在谷歌上搜索了2天,但我没有任何运气,我相信我在搜索尝试中使用了错误的术语

如果你有什么想法,请告诉我,我什么都可以试试


提前谢谢Sean.

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

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

有关详细信息,请参阅此链接:

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

你有两个选择:

  • 在命令行中指定代理
  • 将其硬编码到应用程序中
  • 实际上你有三个

  • 指定一个.properties文件,并从中读取,然后将其设置为系统属性(这与选项2差不多,但更具动态性)
  • 在命令行中,您将使用:

     java -Dhttp.proxyHost=localhost -Dhttp.proxyPort=8080 -jar YourJar.jar
    
    这样,您执行的所有http连接都将通过
    localhost
    端口
    8080

    第二种方法是在程序的主要方法中添加:

    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
    可用


    有关此功能的更多信息

    如果您询问的是套接字连接的常规代理(不是HTTP/FTP特定的!),那么简单的答案是Java不支持它

    为HTTP和FTP通信配置代理时,代理在应用程序协议级别进行。Java端代理属性告诉URLConnection层连接到指定的代理,而不是应用程序尝试连接到的URL的IP地址。Java套接字级别不知道这一情况。它只看到连接到代理的请求

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

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


    因此,如果您真的想为Java应用程序代理所有网络流量,那么这只能在JVM之外实现;也就是说,在JVM(物理或虚拟)主机操作系统的网络传输级别上实现。

    我不完全同意这一点。由于Java 1.5,有内置的SOCKS代理支持(请参见
    java.net.Socket(代理代理)
    constructor)。但是,是的,对于HTTP协议,需要一些额外的层来处理它。Apache
    commons httpclient
    开发人员承诺在库的4.x版本中添加此支持(请参见)。而且……是的……有完全的代理支持(至少在java 6中以及HTTP和FTP中)。请参阅
    sun.net.www.protocol.ftp.FtpURLConnection#connect()
    sun.net.www.protocol.http.HttpURLConnection#plainConnect()
    。以及对身份验证的支持。此处讨论了同样的问题: