当前位置:  技术问答>java相关

请问socket代理的原理:)

    来源: 互联网  发布时间:2015-08-29

    本文导语:  能不能从内部网代理?比喻说网关封了qq,我看到有个软件能在本机作代理。请问这个软件的原理是什么啊?还有,如果跟这个有关的资料,麻烦给个URL,谢谢) | 本技巧将向您讲述如何编写可...

能不能从内部网代理?比喻说网关封了qq,我看到有个软件能在本机作代理。请问这个软件的原理是什么啊?还有,如果跟这个有关的资料,麻烦给个URL,谢谢)

|
本技巧将向您讲述如何编写可通过代理访问因特网上的 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 下测试过。  


后续技巧!  
来自 Marla Bonar: 


对于仍在使用 JDK 1.1.7(配合 WebSphere 3.0)的开发人员而言,将 proxyHost 和 proxyPort 设为系统属性不起作用;conn.getInputStream() 或者返回连接超时,或者是找不到主机路径。但是,我使用接受 Host 和 Port 为参数的 URL 构造函数解决了这一问题(使用我的代理主机和端口):  

public URL(/tech-qa-java/String protocol, String host, int port, String file/index.html).  

来自 Dylan Walsh: 


借助用户名和口令进行认证的方法不起作用。应将 "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); 


来自 Marcel Oerlemans: 


下面是使用 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(); 
        } 
    } 
}  

|
http://www-900.ibm.com/developerWorks/cn/java/l-javaproxy/index.shtml 这篇文章是介绍如何做代理服务器,原理在里面就讲得很清楚了.
http://www-900.ibm.com/developerWorks/cn/java/jw-tips/tip042/index.shtml 这篇文章是描述如何使用 Java 连接处于防火墙之外的 HTTP 服务器 .


|
晕拉,你想跳过网关或代理的机器直接连到外网。那怎么可以。
不过假如你是想在本机有个透明的上网方式,就是说不在程序里面设置代理,还是有可能实现的,确定网关有sock5代理, 可以使用 NEC's e-Border Client 这个软件。 http://www.eemsn.com/diance/html/common/software/5/5.htm 有使用方法。

|
呵呵,关注。我也想做一个这样的程序。

|
啊,看来都是高手啊,小弟是长见识了.

    
 
 

您可能感兴趣的文章:

  • 请问连接池的工作原理和实现
  • 请问关于syslog工作原理和源代码分析的资料
  • 请问 fdisk /mbr 命令是什么 原理?
  • 请问下访问控制列表(ACL)是什么?基本原理是什么?
  • 请问聊天室中显示用户在线离线的原理是怎样?有哪些方法实现呢?
  • 请问学编译原理的用途?
  • 请问 tun/tap interface原理?
  • 请问脚本语言 解析器的工作原理?
  • 请问在Linux下的Tail工具工作原理?
  • 请问谁能讲讲使用软件实现的mcu原理。
  • 请问去银行笔试unix ,数据库原理,都考哪些东东
  • 请问linux下一个很简单的问题:我们的控制台下直接输入某个程序名就可以执行该程序,原理是什么?
  • 请问硬件原理图如何分析,获取每个芯片各自的基地址和地址空间。
  • 数据库 iis7站长之家
  • 请问Stat函数的使用和工作原理
  • 请问手机发送接受邮件的原理是什么?
  • 请问 linux 的Swap分区,对系统运行速度、网站访问速度影响大吗?它的作用和工作原理是什么呢?
  • 请问oicq的原理是什么,运行机制是什么?用java的socket能实现吗?需要了解那些基本协议?看那些书呢?
  • 请问如何在LINUX下设置代理服务器?
  • 请问linux中的浏览器怎样设置代理服务器?
  • 请问一下Linux中使用代理上网的方法
  • 我编了个servlet作代理服务器,请问怎么运行它呢?
  • 请问各位高手,如何用JAVA编一个代理服务器。
  • 请问Linux下最流行的/最好的代理服务器是什么?
  • 请问:再局域网中怎样用代理服务器,我要用GOOGLE!!
  • 请问网关(GATEWAY)和代理服务器有什么区别。
  • 请问在redhat8.0装上qq时(通过http代理),怎么还是不能用啊?
  • 请问如何编写代理服务器?最好能给个例子。
  • 请问:虚拟机的网络代理
  • 请大家帮助,我用red hat as 5做代理服务器,客户端机器上网时常会出现缓存不足的情况,我把缓存加大后仍然无效,请问大家如何解决此问题?谢谢你们!
  • [200请问版主]在squid和iptables配置的透明代理为什么不起作用????
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问:我知道路由器的telnet密码,但忘记了enable 密码,请问如何是好?
  • 请问那里有SYBASE的jbdb 2.0下载;jspsmartupload可以直接将文件上传到数据库,请问如何使用
  • 请问最新的reahat9.0是基于什么核心的?2.4?2.6?请问那里能下载?
  • 请问:请问哪里有关于linux基本操作命令讲解的资料下载,最好是幻灯片格式的.
  • 请问,我试图用#admintool&图形工具命令来安装sun workshop5.0,为什么进入的却是用户管理界面?请问具体该如何在solaris下安装应用软件
  • 请问在Redhat 9里,我从登录就是图形介面,请问如何在图形介面内进入命令行方式呢,谢谢
  • 请问玩过SOLARIS的高手门,在不正常关机后,就不能启动到windows公用桌面了,只能在命令提示模式下了,请问怎么解决这个问题啊?急~!~!
  • 请问:我在redhat下装了bochs-2.2.1-1.rpm,.装了后,想设置一下,但找不到bochsrc.fda.bxrc,请问这个文件在哪个曰录下啊。
  • 请问:在配置Qt时,很多文档都说在.profile,.login里加东西,但是我好像没有发现有这两个文件上,请问这些文件在哪个目录下啊
  • 请问:在GCC里的C程序里的变量的声明是不是只能在前面,而且相同类型的变量的声明只能放在一起?如果不是,请问怎么样可以解决这个问题.
  • 请问各位大虾,小弟今天开始学jsp了,这学期我们有java课,所以已经下载了jdk(好象是1.2),请问我的98环境怎么配置jsp环境呀?我的jdk可以运行.java程序,别的我就不知道了....谢谢!
  • 主机是WIN2000,我用的是LUNIX,请问是否可以共享上网? 如果可以请问如何设置? 500分答谢,龟儿食言!
  • 请问linux下GUI开发的问题!
  • 请问出现fstab文件丢失该怎么修复呀?
  • 请问这个方法如何调用?
  • 请问一个奇怪的问题!
  • 请问在网页中打开的新窗口,如何让其居中。
  • 请问我该学什么了
  • 请问安装zhcon,cxterm问题
  • 非常急! 请问daemontools 在red hat 9下的安装问题? 在线等待


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3