`
endual
  • 浏览: 3506349 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java使用代理服务器访问网络

    博客分类:
  • java
 
阅读更多

 

 

 

 

 

 

 

 

java使用代理服务器访问网络

---------------------------

 有一个需求,如果我要访问http// www.google.com这个页面,通常在大陆是无法访问的,同样

 当在代码中访问该地址的时候,也是不行。因此,如果我需要在代码中或者程序中实现-访问 www.google.com

 并且正常的访问,那么只能在代码中加入代码,然后通过代理服务器进行访问网络,下面的代码就是实现这个功能。

---------------------------

 

 

 

本技巧将向您讲述如何编写可通过代理访问因特网上的   Web   服务器的   Java   应用程序。在   Java   应用程序中加入代理支持只需额外编写几行代码,且不依赖任何安全性“漏洞”。       
 几乎所有的公司都十分关注保护自己的内部网络,以防黑客及入窃者。一种常见的安全措施是完全断开与因特网的连接。如果黑客们不能连接到您的任何一台机器,他们就不能非法进入您的系统。这种策略产生的不利副作用是,内部用户无法访问外部的因特网服务器,如   Yahoo   或  JavaWorld。为了解决这一问题,网络管理员通常安装“代理服务器”。实际上,代理是安装于因特网和内部网之间的一种服务,用来管理这两个领域之间的连接。代理有助于减少安全性的外部威胁,同时还允许内部用户访问因特网服务。尽管   Java  使得编写因特网客户机不再困难,但是如果客户机不能通过代理,则它们毫无用处。幸运的是,Java   使得使用代理支持不再困难   --  如果您知道密诀,这就是事实。       
  将   Java   和代理结合起来的秘诀即在   Java  运行时激活特定的系统属性。这些属性未被写入正式文件,只是作为   Java   传说的一部分在   Java  编程人员中秘传。为了支持代理,Java  应用程序不仅需要指定代理本身的信息,而且需要指定用于认证的用户信息。在开始使用网际协议之前,您需要在程序中添加以下几行代码:       
    
  System.getProperties().put(   "proxySet",   "true"   );     
  System.getProperties().put(   "proxyHost",   "myProxyMachineName"   );     
  System.getProperties().put(   "proxyPort",   "85"   );     
   
  上面的第一行通知   Java  您要通过代理进行连接,第二行指定代理所在的机器,第三行指定代理监听的端口。有些代理在授权用户访问因特网之前,要求用户输入用户名和口令。如果您使用位于防火墙之内的   Web   浏览器,您就可能碰到过这种情况。以下是执行认证的方法:       
  URLConnection   connection   =   url.openConnection();     
  String   password   =   "username:password";     
  String   encodedPassword   =   base64Encode(   password   );     
  connection.setRequestProperty(   "Proxy-Authorization",   encodedPassword   );     
    
  这段代码的思想是,您必须调整   HTTP   标头以发出用户信息。这是通过调用   setRequestProperty()  来实现的。这种方法允许您在发出请求之前处理   HTTP   标头。HTTP   要求用   base64  对用户名和口令进行编码。幸运的是,有一组公用域   API,它们将代您执行编码(请参阅参考资源部分)。       
    
  如您所见,在   Java   应用程序中加入代理支持并不需要做多少工作。有了现在的知识,再做一点研究(您必须查明您的代理是如何处理您感兴趣的协议以及如何进行用户认证的),您就能用其他协议实现代理。       
    
  FTP   代理     
  Scott   D.   Taylor   提出这个秘诀来处理   FTP   协议代理:      
  defaultProperties.put(   "ftpProxySet",   "true"   );     
  defaultProperties.put(   "ftpProxyHost",   "proxy-host-name"   );     
  defaultProperties.put(   "ftpProxyPort",   "85"   );     
  接下来您便可以通过以下代码使用   "ftp"   协议访问文件   URL:          
  URL   url   =   new   URL("ftp://ftp.netscape.com/pub/navigator/3.04/windows/readme.txt"   );       
  如果有人有使用其他网际协议代理的例子,我很想看看。       
    
  注意:代码示例   (Example.java)   仅在   JDK   1.1.4   下测试过。       
    
  对于仍在使用   JDK   1.1.7(配合   WebSphere   3.0)的开发人员而言,将   proxyHost   和  proxyPort   设为系统属性不起作用;conn.getInputStream()  或者返回连接超时,或者是找不到主机路径。但是,我使用接受   Host   和   Port   为参数的   URL  构造函数解决了这一问题(使用我的代理主机和端口):       
    
  public   URL(String   protocol,   String   host,   int   port,   String   file).       
      借助用户名和口令进行认证的方法不起作用。应将   "Basic   "   置于认证字符串的开头;例如:       
  String   encodedPassword   =   base64Encode(   password   );       
    
  应该是:       
    
  String   encodedPassword   =   "Basic   "   +   base64Encode(   password   );       
    
  您也不必用一个单独的程序来进行   64   位编码。您可以使用   sun.misc.BASE64Encoder()   类。下面是完成这两处改动之后的代码:       
    
  System.getProperties().put("proxySet",   "true");     
  System.getProperties().put("proxyHost",   proxyHost);     
  System.getProperties().put("proxyPort",   proxyPort);     
  String   authString   =   "userid:password";     
  String   auth   =   "Basic   "   +   new   sun.misc.BASE64Encoder     
  ().encode(authString.getBytes());     
  URL   url   =   new   URL("http://java.sun.com/");     
  URLConnection   conn   =   url.openConnection();     
  conn.setRequestProperty("Proxy-Authorization",   auth);     
    
  下面是使用   socks   4   代理服务器的方法:       
  System.getProperty("socksProxySet",   true);     
  System.getProperty("socksProxyHost",   proxyHostName);     
  System.getProperty("socksProxyPort",   proxyPort);     
  Usually   the   proxyPort   for   Socks   4   is   port   1080     
    
  接下来您就可以用   Socks   4   进行连接了。       
    
  ///下面是一个例子!   
  import   java.util.Properties;     
  import   java.util.Date;     
  import   java.net.URL;     
  import   java.net.URLEncoder;     
  import   java.net.HttpURLConnection;     
  import   java.net.URLConnection;     
  import   java.io.DataInputStream;     
  import   java.io.DataOutputStream;     
    
  //   This   is   a   simple   example   that   shows   how   to   get   HTTP   connections   to   work     
  //   with   a   proxy   server.   If   all   goes   well,   we   should   be   able   to   post   some     
  //   data   to   a   public   cgi   script   and   get   back   the   resulting   HTML.     If   anyone       
  //   knows   some   "gotchas"   when   combining   Java   and   proxies,   I'd   love   to   hear     
  //   about   them.     Send   your   thoughts   to   kurr@ctron.com.       
    
  public   class   ProxyTest     
  {     
          public   static   void   main(   String   argv[]   )     
          {     
                  try     
                  {     
                          //   Enable   the   properties   used   for   proxy   support     
                          System.getProperties().put(   "proxySet",   "true"   );     
                          System.getProperties().put(   "proxyHost",   "proxy2"   );     
                          System.getProperties().put(   "proxyPort",   "85"   );     
    
                          //   URL   to   a   public   cgi   script     
                          URL   url   =   new   URL("http://hoohoo.ncsa.uiuc.edu/cgi-bin/post-query/");     
                          URLConnection   connection   =   url.openConnection();     
    
                          //   enter   the   username   and   password   for   the   proxy     
                          String   password   =   "username:password";     
    
                          //   base64   encode   the   password.     You   can   write   your   own,     
                          //   use   a   public   domain   library   like     
                          //   http://www.innovation.ch/java/HTTPClient/   or   use       
                          //   the   sunw.server.admin.toolkit.security.BASE64Encoder     
                          //   class   from   JavaSoft   Java   Web   Server.     
                          String   encoded   =   base64Encode(   password   );     
    
                          //   Set   up   the   connection   so   it   knows   you   are   sending     
                          //   proxy   user   information     
                          connection.setRequestProperty(   "Proxy-Authorization",   encoded   );     
    
                          //   Set   up   the   connection   so   you   can   do   read   and   writes       
                          connection.setDoInput(   true   );     
                          connection.setDoOutput(   true   );     
    
                          //   open   up   the   output   stream   of   the   connection     
                          DataOutputStream   output   =   new   DataOutputStream(       
                                                                             connection.getOutputStream()   );       
    
                          //   simulate   a   POST   from   a   web   form     
                          String   query   =     "name="   +   URLEncoder.encode(       
                                                          "Ronald   D.   Kurr"   );     
                          query   +=   "&";     
                          query   +=   "email="   +   URLEncoder.encode(   "kurr@ctron.com"   );     
    
                          //   write   out   the   data     
                          int   queryLength   =   query.length();     
                          output.writeBytes(   query   );     
                          output.close();     
    
                          //   get   ready   to   read   the   response   from   the   cgi   script     
                          DataInputStream   input   =   new   DataInputStream(       
                                                                             connection.getInputStream()   );       
    
                          //   read   in   each   character   until   end-of-stream   is   detected     
                          for(   int   c   =   input.read();   c   !=   -1;   c   =   input.read()   )     
                          {     
                                  System.out.print(   (char)c   );     
                          }     
                          input.close();     
                  }     
                  catch(   Exception   e   )     
                  {     
                          System.out.println(   "Something   bad   just   happened."   );     
                          System.out.println(   e   );     
                          e.printStackTrace();     
                  }     
          }     
  }      

分享到:
评论

相关推荐

    JAVA 通过proxy代理方式访问internet资源

    JAVA 通过proxy代理方式访问internet资源,

    Java代理服务器:这是用Java编写的简单HTTPHTTPS代理服务器

    Java HTTP / HTTPS代理服务器代理服务器代理服务器是位于客户端和客户端希望从中检索文件的远程服务器之间的服务器。 来自客户端的所有流量都被发送到代理服务器,并且代理服务器代表客户端向远程服务器发出请求。 ...

    编写简单的代理服务器(java源码)

    代理服务器打开一个端口接收浏览器发来的访问某个站点的请求,从请求的字符串中解析出用户想访问哪个网页,让后通过URL对象建立输入流读取相应的网页内容,最后按照web服务器的工作方式将网页内容发送给用户浏览器 ...

    springboot集成netty实现代理服务器

    springboot集成netty实现代理服务器,实现http和https请求的代理功能

    socketproxy:一个简单的 Java 多线程 Socket 代理服务器。 它侦听传入的连接并将任何通信转发到服务器,同时记录整个对话

    套接字代理一个简单的 Java 多线程 Socket 代理服务器。 它侦听传入的连接并将任何通信转发到服务器,同时记录整个对话。套接字代理服务器这是库的主类。 它可以由第三方实例化,并提供本地端口和服务器的远程主机/...

    SocketHttp代理插件访问公网

    但项目又需要访问互联网上的接口资源,只能通过内网中可以跟公网连接的一台服务器作为代理跳转请求公网资源,觉得其他代理插件麻烦就自己写了一个SocketHttp代理,简单、方便使用、易维护。 2、附件有源码,直接打包...

    Java网络高级编程

    第10章介绍Java安全体系结构、密钥、消息摘要、数字签名、访问控制、安全套接口SSL、主体身份认证JAAS和公共密钥构架PKI技术。第11章简明地介绍移动代理编程技术。 本书可作为高校计算机应用、网络信息、电子商务...

    基于 Java 的 NAT 软交换代理及存储集群系统研究

    NAT 在代理服务器、路由器、防火墙等领域应用广泛,但在存储系统方面的应用还很少。为此,探讨 NAT 种类、应用及核心思想,及用 Java 网络包 java.net 实现 NAT 软交换的思路和方法,并根据网络存储系统安全问题,...

    java开源包4

    Smart Cache 是一个采用 Java 开发的 HTTP/1.1代理服务器,也可以用来作为Web的缓存系统。 高性能的JSON处理 Jackson Jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好。 哈希计算工具 java-hash ...

    JAVA_API1.6文档(中文)

    javax.management.remote 对 JMX MBean 服务器进行远程访问使用的接口。 javax.management.remote.rmi RMI 连接器是供 JMX Remote API 使用的一种连接器,后者使用 RMI 将客户端请求传输到远程 MBean 服务器。 ...

    java开源包8

    Smart Cache 是一个采用 Java 开发的 HTTP/1.1代理服务器,也可以用来作为Web的缓存系统。 高性能的JSON处理 Jackson Jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好。 哈希计算工具 java-hash ...

    weixin-java-miniapp-2.8.0-API文档-中文版.zip

    赠送jar包:weixin-java-miniapp-2.8.0.jar; 赠送原API文档:weixin-java-miniapp-2.8.0-javadoc.jar; 赠送源代码:weixin-java-miniapp-2.8.0-sources.jar; 赠送Maven依赖信息文件:weixin-java-miniapp-2.8.0....

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java开源包11

    Smart Cache 是一个采用 Java 开发的 HTTP/1.1代理服务器,也可以用来作为Web的缓存系统。 高性能的JSON处理 Jackson Jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好。 哈希计算工具 java-hash ...

    java开源包6

    Smart Cache 是一个采用 Java 开发的 HTTP/1.1代理服务器,也可以用来作为Web的缓存系统。 高性能的JSON处理 Jackson Jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好。 哈希计算工具 java-hash ...

    java开源包9

    Smart Cache 是一个采用 Java 开发的 HTTP/1.1代理服务器,也可以用来作为Web的缓存系统。 高性能的JSON处理 Jackson Jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好。 哈希计算工具 java-hash ...

    java开源包101

    Smart Cache 是一个采用 Java 开发的 HTTP/1.1代理服务器,也可以用来作为Web的缓存系统。 高性能的JSON处理 Jackson Jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好。 哈希计算工具 java-hash ...

    java开源包5

    Smart Cache 是一个采用 Java 开发的 HTTP/1.1代理服务器,也可以用来作为Web的缓存系统。 高性能的JSON处理 Jackson Jackson 是一个 Java 用来处理 JSON 格式数据的类库,性能非常好。 哈希计算工具 java-hash ...

Global site tag (gtag.js) - Google Analytics