Java通过网络代理访问网络

也可以在通过命令行启动一个应用Java应用程序的JVM时,设置如下参数启动网络代理:

java -Dhttp.proxyHost=myproxyserver.com -Dhttp.proxyPort=80 MyJavaApp

或者在自己的Java代码中添加如下代码:

System.setProperty("http.proxyHost", "myProxyServer.com");System.setProperty("http.proxyPort", "80");

自Java1.5以后,也可以通过给openConnection()方法传递一个Java.net.Proxy类实例来启用网络代理:

//Proxy实例, 代理ip:123.0.0.1,端口号:8080Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("123.0.0.1", 8080));URL url = new URL("http://www.yahoo.com");HttpURLConnection uc = (HttpURLConnection)url.openConnection(proxy);uc.connect();          String page;StringBuffer tmp = new StringBuffer();BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream()));while ((line = in.readLine()) != null){   page.append(line + "\n");}System.out.println(page);

这样的话,就不需要设置系统属性(system properties)了。

你也可以使用默认的PROXY作为你的网络设置。

System.setProperty("java.net.useSystemProxies", "true");List l = null;try {  l = ProxySelector.getDefault().select(new URI("http://www.yahoo.com"));}catch (URISyntaxException e) {  e.printStackTrace();}  if (l != null) {   for (Iterator iter = l.iterator(); iter.hasNext() {      java.net.Proxy proxy = (java.net.Proxy) iter.next();      System.out.println("proxy hostname : " + proxy.type());      InetSocketAddress addr = (InetSocketAddress) proxy.address();      if (addr == null) {        System.out.println("No Proxy");      }       else {        System.out.println("proxy hostname : " + addr.getHostName());        System.out.println("proxy port : " + addr.getPort());      }   }}

通过传递代理:

URL url = new URL("http://internal.server.local/");URLConnection conn = url.openConnection(Proxy.NO_PROXY);

代理与Username/Password

你可能需要定义你自己的代理服务器。

一种方案是使用HTTP代理“Proxy-Authorization”,传递一个username:password的base64编码字符串。

System.setProperty("http.proxyHost", "myProxyServer.com");System.setProperty("http.proxyPort", "80");URL url=new URL("http://someserver/somepage");URLConnection uc = url.openConnection ();String encoded = new String(Base64.base64Encode(new String("username:password").getBytes()));uc.setRequestProperty("Proxy-Authorization", "Basic " + encoded);uc.connect();

注意: 关于base64函数,查看这里:http://www.rgagnon.com/javadetails/java-0084.html。

下面的示例会对一个URL发起连接,但是在此之前,我们得定义我们的代理。

import java.net.*;import java.io.*;  public class URLUtils {  public static void main(String s[]) {    URLUtils.dump("http://www.yahoo.com");    System.out.println("**************");    URLUtils.dump("https://www.paypal.com");    System.out.println("**************");  }    public static void dump(String URLName){    try {      DataInputStream di = null;      FileOutputStream fo = null;      byte [] b = new byte[1];        // PROXY      System.setProperty("http.proxyHost","proxy.mydomain.local") ;      System.setProperty("http.proxyPort", "80") ;        URL u = new URL(URLName);      HttpURLConnection con = (HttpURLConnection) u.openConnection();      //      // 这不是一个使用sun.misc.* class的好主意      // Sun强烈建议,不要去使用它们      // 因为它有可能会在未来的版本中做出修改甚至删除      // 所以,请慎重      sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();      String encodedUserPwd =         encoder.encode("mydomain\\MYUSER:MYPASSWORD".getBytes());      con.setRequestProperty         ("Proxy-Authorization", "Basic " + encodedUserPwd);      // PROXY ----------        di = new DataInputStream(con.getInputStream());      while(-1 != di.read(b,0,1)) {         System.out.print(new String(b));      }    }    catch (Exception e) {      e.printStackTrace();    }  }}

在JDK1.2中,java.net.Authenticator通常可以在需要时传递一个凭证。

public static void dump(String URLName){  try {    DataInputStream di = null;    FileOutputStream fo = null;    byte [] b = new byte[1];      // PROXY    System.setProperty("http.proxyHost","proxy.mydomain.local") ;    System.setProperty("http.proxyPort", "80") ;      Authenticator.setDefault(new Authenticator() {      protected PasswordAuthentication getPasswordAuthentication() {        return new           PasswordAuthentication("mydomain\\username","password".toCharArray());    }});      URL u = new URL(URLName);    HttpURLConnection con = (HttpURLConnection) u.openConnection();    di = new DataInputStream(con.getInputStream());    while(-1 != di.read(b,0,1)) {       System.out.print(new String(b));    }  }  catch (Exception e) {          e.printStackTrace();  }}

通过传递代理 不畏不惧,不言不弃,冲破风雨的阻隔,黎明就在前方!

Java通过网络代理访问网络

相关文章:

你感兴趣的文章:

标签云: