用Java编写通过代理访问的应用程序
作者:Ron Kurr 来源:天极网 添加时间:2006-5-25 21:38:43System.getProperties().put("proxyHost","myProxyMachineName");
System.getProperties().put("proxyPort","85");
上面的第一行通知Java您要通过代理进行连接,第二行指定代理所在的机器,第三行指定代理监听的端口。有些代理在授权用户访问因特网之前,要求用户输入用户名和口令。如果您使用位于防火墙之内的Web浏览器,您就可能碰到过这种情况。以下是执行认证的方法:
| URLConnectionconnection=url.openConnection(); Stringpassword="username:password"; StringencodedPassword=base64Encode(password); connection.setRequestProperty("Proxy-Authorization",encodedPassword); |
这段代码的思想是,您必须调整HTTP标头以发出用户信息。这是通过调用setRequestProperty()来实现的。这种方法允许您在发出请求之前处理HTTP标头。HTTP要求用base64对用户名和口令进行编码。幸运的是,有一组公用域API,它们将代您执行编码(请参阅参考资源部分)。
如您所见,在Java应用程序中加入代理支持并不需要做多少工作。有了现在的知识,再做一点研究(您必须查明您的代理是如何处理您感兴趣的协议以及如何进行用户认证的),您就能用其他协议实现代理。
FTP代理
ScottD.Taylor提出这个秘诀来处理FTP协议代理:
| defaultProperties.put("ftpProxySet","true"); defaultProperties.put("ftpProxyHost","proxy-host-name"); defaultProperties.put("ftpProxyPort","85"); |
接下来您便可以通过以下代码使用"ftp"协议访问文件URL:
| URLurl=newURL("ftp://ftp.netscape.com/pub/navigator/3.04/windows/readme.txt"); |
如果有人有使用其他网际协议代理的例子,我很想看看。
注意:代码示例(Example.java)仅在JDK1.1.4下测试过。
后续技巧!
对于仍在使用JDK1.1.7(配合WebSphere3.0)的开发人员而言,将proxyHost和proxyPort设为系统属性不起作用;conn.getInputStream()或者返回连接超时,或者是找不到主机路径。但是,我使用接受Host和Port为参数的URL构造函数解决了这一问题(使用我的代理主机和端口):
| publicURL(Stringprotocol,Stringhost,intport,Stringfile). |
借助用户名和口令进行认证的方法不起作用。应将"Basic"置于认证字符串的开头;例如:
| StringencodedPassword=base64Encode(password); |
应该是:
| StringencodedPassword="Basic"+base64Encode(password); |
您也不必用一个单独的程序来进行64位编码。您可以使用sun.misc.BASE64Encoder()类。下面是完成这两处改动之后的代码:
| System.getProperties().put("proxySet","true"); System.getProperties().put("proxyHost",proxyHost); System.getProperties().put("proxyPort",proxyPort); StringauthString="userid:password"; Stringauth="Basic"+newsun.misc.BASE64Encoder ().encode(authString.getBytes()); URLurl=newURL("http://java.sun.com/"); URLConnectionconn=url.openConnection(); conn.setRequestProperty("Proxy-Authorization",auth); |
下面是使用socks4代理服务器的方法:
| System.getProperty("socksProxySet",true); System.getProperty("socksProxyHost",proxyHostName); System.getProperty("socksProxyPort",proxyPort); UsuallytheproxyPortforSocks4isport1080 |
接下来您就可以用Socks4进行连接了。
站内搜索