请问..java的NIO客户端怎么设置代理呢?
我会用jsocks的包实现有用户验证的Socket代理连接.
但使用SocketChannel.open()返回的是已经创建好的socket找了些资料.有的说代理服务器也需要支持NIO才能做连接..如果是,能告诉我有哪些(在linux运行)代理服务器是实现NIO的吗?
要自己写一个NIO的代理服务器吗??

解决方案 »

  1.   

    在开始使用网际协议之前,您需要在程序中添加以下几行代码: 
    System.getProperties().put("proxySet","true"); 
    System.getProperties().put("proxyHost","myProxyMachineName"); 
    System.getProperties().put("proxyPort","85"); 
    Java代码  :
    URLConnectionconnection=url.openConnection();  
    Stringpassword="username:password";  
    StringencodedPassword=base64Encode(password);  
    connection.setRequestProperty("Proxy-Authorization",encodedPassword);  
      

  2.   

    将Java和代理结合起来的秘诀即在Java运行时激活特定的系统属性。这些属性未被写入正式文件,只是作为Java传说的一部分在Java编程人员中秘传。为了支持代理,Java应用程序不仅需要指定代理本身的信息,而且需要指定用于认证的用户信息。在开始使用网际协议之前,您需要在程序中添加以下几行代码: 
    System.getProperties().put("proxySet","true"); 
    System.getProperties().put("proxyHost","myProxyMachineName"); 
    System.getProperties().put("proxyPort","85"); 上面的第一行通知Java您要通过代理进行连接,第二行指定代理所在的机器,第三行指定代理监听的端口。有些代理在授权用户访问因特网之前,要求用户输入用户名和口令。如果您使用位于防火墙之内的Web浏览器,您就可能碰到过这种情况。以下是执行认证的方法: 
    Java代码  
     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协议代理: 
    Java代码  
     defaultProperties.put("ftpProxySet","true");  
    defaultProperties.put("ftpProxyHost","proxy-host-name");  
    defaultProperties.put("ftpProxyPort","85");  
    接下来您便可以通过以下代码使用"ftp"协议访问文件URL: 
    Java代码  
    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构造函数解决了这一问题(使用我的代理主机和端口): 
    Java代码  
    publicURL(Stringprotocol,Stringhost,intport,Stringfile).  借助用户名和口令进行认证的方法不起作用。应将"Basic"置于认证字符串的开头;例如: 
    Java代码  
    StringencodedPassword=base64Encode(password);  应该是: 
    Java代码  
    StringencodedPassword="Basic"+base64Encode(password);  您也不必用一个单独的程序来进行64位编码。您可以使用sun.misc.BASE64Encoder()类。下面是完成这两处改动之后的代码: 
    Java代码  
    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代理服务器的方法: 
    Java代码  
    [System.getProperty("socksProxySet",true);  
    System.getProperty("socksProxyHost",proxyHostName);  
    System.getProperty("socksProxyPort",proxyPort);  
    UsuallytheproxyPortforSocks4isport1080/code]  
      
    接下来您就可以用Socks4进行连接了。  
         <转载的~~~ 楼主可以看看~~>
      

  3.   

    非常感谢..如果我希望为每个连接指定不同的代理该如何做呢??希望能把代理指定到一个socket连接里.一个程序里有多个连接..每个连接需要使用不同的代理.谢谢.
      

  4.   

    关于代理这方面不是很懂、楼主在等待回答的时候可以上百度、google搜搜相关的资料、、终究一直等待回答不一定能等到满意答案呢~ 呵呵
      

  5.   

    找了一个礼拜了才来发帖....到现在也一直在找..没有停止搜索...只是xsocket的资料很少...xsocket的主页也关了..帮助文件里只有http的简单代理服务器例子..基本E文和中文的都看过..在尝试修改他的代理服务器例子..但有很多问题..在解决中..毕竟自己写的会有很多问题..还是希望有其他好点的解决办法..
    也试过用阻塞的socket连接NIO服务器..但不知道为什么..客户端发送后..就是没法收取返回的信息..