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