我正在尝试找到一种方法来强制 Jar 通过我的代理服务器对外部 IP 进行任何连接尝试,该代理服务器在 localhost(也是 Java 应用程序)上运行。一旦代理服务器接收到连接,它将打开与外部 IP 的连接并开始将 IO 路由到客户端/服务器。
我已经用谷歌搜索了 2 天,但我没有任何运气,我相信我在搜索尝试中使用了错误的术语。
如果您有任何想法,请告诉我,我会尝试任何事情。
提前致谢。- 肖恩。
如果那是“真正的”代理,您可以使用 java 系统属性指定要使用的代理。
您有两种选择:
那么你实际上有三个
从命令行您将使用:
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
可从类路径中获得
有关此功能的更多信息在这里
如果您询问的是套接字连接的一般(不是 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(物理或虚拟)主机操作系统的网络传输层。
如果是 HTTP 流量或 FTP 流量,您可以尝试以下系统属性:
http.proxyHost(默认:) http.proxyPort(默认:如果指定了 http.proxyHost,则为 80) http.nonProxyHosts(默认:
有关详细信息,请参阅此链接:
http://java.sun.com/docs/books/tutorial/networking/urls/_setProxy.html