启动选项以强制Java套接字连接到本地主机?
我试图找到一种方法,通过我的代理服务器,强制Jar尝试连接外部IP,代理服务器运行在localhost(也是一个Java应用程序)上。 一旦代理服务器接收到连接,它将打开与外部IP的连接,并开始在客户端/服务器之间来回路由IO 我已经在谷歌上搜索了2天,但我没有任何运气,我相信我在搜索尝试中使用了错误的术语 如果你有什么想法,请告诉我,我什么都可以试试启动选项以强制Java套接字连接到本地主机?,java,proxy,localhost,Java,Proxy,Localhost,我试图找到一种方法,通过我的代理服务器,强制Jar尝试连接外部IP,代理服务器运行在localhost(也是一个Java应用程序)上。 一旦代理服务器接收到连接,它将打开与外部IP的连接,并开始在客户端/服务器之间来回路由IO 我已经在谷歌上搜索了2天,但我没有任何运气,我相信我在搜索尝试中使用了错误的术语 如果你有什么想法,请告诉我,我什么都可以试试 提前谢谢Sean.如果是HTTP流量或FTP流量,您可以尝试以下系统属性: http.proxyHost(默认值:) http.proxyPor
提前谢谢Sean.如果是HTTP流量或FTP流量,您可以尝试以下系统属性: http.proxyHost(默认值:) http.proxyPort(如果指定了http.proxyHost,则默认值为80) http.nonProxyHosts(默认值: 有关详细信息,请参阅此链接: 如果这是一个“真正的”代理,您可以使用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
可用
有关此功能的更多信息如果您询问的是套接字连接的常规代理(不是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协议,需要一些额外的层来处理它。Apachecommons httpclient
开发人员承诺在库的4.x版本中添加此支持(请参见)。而且……是的……有完全的代理支持(至少在java 6中以及HTTP和FTP中)。请参阅sun.net.www.protocol.ftp.FtpURLConnection#connect()
和sun.net.www.protocol.http.HttpURLConnection#plainConnect()
。以及对身份验证的支持。此处讨论了同样的问题: