最近比较忙,很久一段时间没有写博文了。今天和大家一起学习一下在JAVA程序如何使用网络代理(Http、socks代理)。我想网络代理设置大家并不陌生,基本在每一个客户端程序都具备这个功能。闲话不多说,马上开始。老规矩先上我这些新学朋友最喜欢的地方:http://docs.oracle.com/javase/6/docs/technotes/guides/net/proxies.html
在JAVA程序中要使用网络代理,有两种设置的方式:
一、在JAVA可视化控制面板中直接设置。如下图:
这种方式就不多说了,很直观明了。
二、在程序中设置网络代理。
下面主要是讲述第二种方式如何在JAVA程序中设置网络代理。
在程序中设置网络代理又分为两种:
1)"全局"网络代理
所谓的“全局”,指的是一旦设置了代理,就会在整个程序中起作用。使用非常简单,
下面是设置Http代理:
System.setProperty("proxySet", "true"); System.setProperty("http.proxyHost", sProxyHost); System.setProperty("http.proxyPort", sProxyPort)
设置Socks代理:
System.setProperty("proxySet", "true"); System.setProperty("socksProxyHost", sProxyHost); System.setProperty("socksProxyPort", sProxyPort);
Ftp、Https代理也类似,详情可以登录官网看一下。这里主要针对常用的Http、Socks代理。
不过,值得注意的是使用这种方式,如果输入的sProxyHost和sProxyPort不匹配(也就是说代理不可用)时,系统不会有任何提示,同时它会使用本地的网络进行网络连接。所以这样就照成了一个问题,场景:假如你的电脑可以上网,但是你想你的程序使用某个代理进行登录,还不幸运,恰恰这时你输入的代理地址或者代理端口不正确,但是系统没有提示任何错误,而且成功登录,给大家的错觉大家可能会以为这个代理成功了。其实像上面的场景,代理并没有成功,只是使用了本地可用的网络连接。如何解决这种情况呢,下面会说到。
2) “局部”网络代理
所谓的"局部",指的是代理设置只在某个连接中起作用。
设置Http代理 (代码片段)
SocketAddress addr = new InetSocketAddress("122.72.88.85", 80); Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); URL url = new URL("http://www.google.com.tw"); URConnection conn = url.openConnection(proxy);
设置Socks代理(代码片段,来自官网)
SocketAddress addr = new InetSocketAddress("122.72.88.85", 1080); Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); Socket socket = new Socket(proxy); InetSocketAddress dest = new InetSocketAddress("server.foo.com", 1234); socket.connect(dest);
3)用户验证。
在官网中也详细提到,这里不再累赘了。http://docs.oracle.com/javase/6/docs/technotes/guides/net/http-auth.html
对于上面红色字体部分的解决方案: 先用“局部”网络代理的方式进行测试,测试这个代理地址和端口是否可用,如果代理成功就使用 "全局"网络代理的方式来设置网络代理。下面来个例子(以Http代理为例子,其他的代理也差不多):
import java.net.Authenticator; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.PasswordAuthentication; import java.net.Proxy; import java.net.URL; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; /** * <code>ProxySettingSample</code> * * @author Jimmy(SZ) * * @since <i>May 25, 2013</i> */ public class ProxySettingSample { public static final String PRXOY_HOST = "122.129.120.172"; public static final String PROXY_PORT = "8080"; public static final String TEST_ADDRESS = "http://www.google.com.tw"; private static final ExecutorService EXECUTOR = Executors.newSingleThreadExecutor(); /** * @param args */ public static void main(String[] args) { // 用户验证 if (args.length == 2) { Authenticator.setDefault(new LoginAuthenticator(args[0], args[1])); } Callable<Boolean> oCallback = new Callable<Boolean>() { @Override public Boolean call() throws Exception { HttpURLConnection oConn = null; try { Proxy oProxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PRXOY_HOST, Integer.parseInt(PROXY_PORT))); URL url = new URL("http://www.aastocks.com"); oConn = (HttpURLConnection) url.openConnection(oProxy); oConn.setConnectTimeout(5000); oConn.connect(); } catch (Exception e) { e.printStackTrace(); // 如果报异常证明,代理设置不可用 return false; } finally { if (oConn != null) { oConn.disconnect(); } } return true; } }; FutureTask<Boolean> oTask = new FutureTask<Boolean>(oCallback) { @Override protected void done() { try { Boolean bCheckSuccess = (Boolean)this.get(); if (bCheckSuccess) { // 代理测试成功 System.err.println("代理成功"); // 测试成功后再使用"全局网络代理" System.setProperty("proxySet", "true"); System.setProperty("http.proxyHost", PRXOY_HOST); System.setProperty("http.proxyPort", PROXY_PORT); } else { //代理设置失败 System.err.println("无法连接到网络,请检查代理设置!!"); } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }; EXECUTOR.submit(oTask); EXECUTOR.shutdown(); } static class LoginAuthenticator extends Authenticator { /** User name **/ private String m_sUser; /** Password **/ private String m_sPsw; public LoginAuthenticator(String sUser, String sPsw) { m_sUser = sUser; m_sPsw = sPsw; } public PasswordAuthentication getPasswordAuthentication() { return (new PasswordAuthentication(m_sUser, m_sPsw.toCharArray())); } } }
例子上面的PRXOY_HOST 和PROXY_PORT 是从网上找的Http代理服务器(http://51dai.li/http_fast.html)。
相关推荐
在给定的标题“使用Java基于Netty+Socks5+TLS实现的代理服务.zip”中,我们可以看到三个核心概念:Netty、Socks5和TLS,这些都是构建高效、安全网络服务的关键组件。 Netty是一个高性能、异步事件驱动的网络应用...
代理IP分为多种类型,其中HTTP和HTTPS代理主要处理基于HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)的网络请求,而SOCKS5代理则是一种通用的代理协议,支持TCP/IP层的各种协议,包括HTTP、FTP等。...
这些函数可能包括设置HTTP代理、设置SOCKS代理、启用或禁用代理等。 4. **操作注册表**:通过`registry.jar`提供的API,读取或写入注册表中的关键值,如`HKEY_CURRENT_USER\Software\Microsoft\Windows\Current...
文档详细描述,linux不通外网的情况下,通过在另一台通外网的服务器搭建socks5代理服务,不通外网的服务器通过socks5代理,成功向外网发送邮件的功能。
`Proxy`类是Java中表示网络代理的抽象类,它可以是HTTP、SOCKS或任何其他类型的代理。你可以通过以下方式创建一个`Proxy`对象: ```java Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(...
当程序运行时,它会使用系统默认的网络代理设置,包括HTTP和SOCKS代理。在Windows系统中,如果用户在IE浏览器中配置了代理,这些设置会被系统全局应用。 要使Java程序使用IE代理,我们可以利用`System.setProperty...
Java 实现的代理服务器是一种网络通信工具,它允许客户端通过该服务器作为中介与目标服务器进行交互,从而隐藏了客户端的真实身份或提供了额外的...通过阅读和分析这些代码,你可以深入理解Java代理服务器的实现细节。
支持正向代理、反向代理、透明代理、TCP和UDP内网穿透、HTTP和HTTPS内网穿透、https和http代理、socks5代理、负载均衡、TCP/UDP转发、SSH中转、TLS加密传输、协议转换、防污染DNS代理,限速等。
Sock4和Sock5代理统称为Socks代理,通常用于各种使用TCP/IP协议的程序。其中Sock4代理只支持TCP数据传送,Sock5代理支持TCP和UDP数据传送,同时还支持多种客户验证功能。 不管哪种代理,都要通过一系列协商会话,...
支持正向代理、反向代理、透明代理、TCP和UDP内网穿透、HTTP和HTTPS内网穿透、https和http代理、socks5代理、负载均衡、TCP/UDP转发、SSH中转、TLS加密传输、协议转换、防污染DNS代理,限速等。
HTTP代理仅适用于HTTP和HTTPS协议,而SOCKS代理则支持多种协议,包括FTP、SMTP等。在调用Web服务时,需要选择与目标服务匹配的代理类型。 3. **认证**:有些代理服务器需要身份验证,这通常涉及到用户名和密码。在...
用Rust实现仿nginx,力争实现一个可替代方案,http/https代理, socks5代理, 负载均衡, 反向代理, 静态文件服务器,四层TCP/UDP转发,websocket转发, 内网穿透nat
ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...
对于HTTP代理来说,监听80端口是常见的,对于SOCKS代理来说,4160端口或更高端口可能是默认配置。连接建立后,代理服务器根据协议和配置转发数据请求到目标服务器,或者执行特定的代理逻辑。 ### 多线程与并发处理 ...
杰吉尔 Jargyle是Java SOCKS5服务器。 它具有以下功能: SOCKS5协议规范的100%实现,包括和尽管Jargyle可以充当独立的SOCKS5服务器,但它可以充当以下两者之间的桥梁: 使用纯文本连接和无SOCKS5身份验证访问SOCKS5...
总的来说,这个压缩包提供的源码是学习和理解Java网络编程,特别是Socket通信和SOCKS代理协议的宝贵资源。通过研究这些代码,你可以深入理解如何在Java中实现网络连接,发送和接收数据,以及如何利用SOCKS协议进行...
JAVA,代理服务器,JAVA代理服务器 本小工具是使用JAVA开发的代理服务器,只要设置好代理端口(端口在100~65000之内的任意没被占用的端口都可以),点击启动,局域网内用户就可以设置通过代理联网
Java的`Socket`和`ServerSocket`类提供了许多配置选项,如设置超时、启用或禁用SOCKS代理等,以适应各种网络环境和需求。 7. **HTTP协议**: Java网络编程常用于实现HTTP客户端和服务器,理解HTTP的基本概念,如...
官方网站:http://www.socksviahttp.com<br>Socks via HTTP 是一个将 SOCKS 请求 转换为 HTTP 请求 的程序,如果需要的话,还可以设置 HTTP 代理。
【标题】"socks_purose.rar_socks" 提到的关键词是 "socks",这通常指的是网络通信中的 SOCKS (Socket Secure) 协议。SOCKS 是一种网络代理协议,...在移动设备上,使用SOCKS代理可以优化网络连接性能,提高游戏体验。