`

JAVA网络代理(Http、Socks等代理)

 
阅读更多

     最近比较忙,很久一段时间没有写博文了。今天和大家一起学习一下在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)。

 

  • 大小: 42.5 KB
分享到:
评论

相关推荐

    使用Java基于Netty+Socks5+TLS实现的代理服务.zip

    在给定的标题“使用Java基于Netty+Socks5+TLS实现的代理服务.zip”中,我们可以看到三个核心概念:Netty、Socks5和TLS,这些都是构建高效、安全网络服务的关键组件。 Netty是一个高性能、异步事件驱动的网络应用...

    代理IP检测工具,HTTP/HTTPS/SOCKS5协议连通率和延迟检测

    代理IP分为多种类型,其中HTTP和HTTPS代理主要处理基于HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)的网络请求,而SOCKS5代理则是一种通用的代理协议,支持TCP/IP层的各种协议,包括HTTP、FTP等。...

    java操作IE代理

    这些函数可能包括设置HTTP代理、设置SOCKS代理、启用或禁用代理等。 4. **操作注册表**:通过`registry.jar`提供的API,读取或写入注册表中的关键值,如`HKEY_CURRENT_USER\Software\Microsoft\Windows\Current...

    socks5代理配置及发送邮件.rar

    文档详细描述,linux不通外网的情况下,通过在另一台通外网的服务器搭建socks5代理服务,不通外网的服务器通过socks5代理,成功向外网发送邮件的功能。

    java LAN使用代理服务器

    `Proxy`类是Java中表示网络代理的抽象类,它可以是HTTP、SOCKS或任何其他类型的代理。你可以通过以下方式创建一个`Proxy`对象: ```java Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(...

    Java中使用IE Proxy代理的方法

    当程序运行时,它会使用系统默认的网络代理设置,包括HTTP和SOCKS代理。在Windows系统中,如果用户在IE浏览器中配置了代理,这些设置会被系统全局应用。 要使Java程序使用IE代理,我们可以利用`System.setProperty...

    基于Java实现的代理服务器

    Java 实现的代理服务器是一种网络通信工具,它允许客户端通过该服务器作为中介与目标服务器进行交互,从而隐藏了客户端的真实身份或提供了额外的...通过阅读和分析这些代码,你可以深入理解Java代理服务器的实现细节。

    一个高性能的http代理、https代理、socks5代理、内网穿透代理服务器、游戏盾、游戏代理,支持API代理认证,高防服务器

    支持正向代理、反向代理、透明代理、TCP和UDP内网穿透、HTTP和HTTPS内网穿透、https和http代理、socks5代理、负载均衡、TCP/UDP转发、SSH中转、TLS加密传输、协议转换、防污染DNS代理,限速等。

    Java开发代理服务器.pdf

    Sock4和Sock5代理统称为Socks代理,通常用于各种使用TCP/IP协议的程序。其中Sock4代理只支持TCP数据传送,Sock5代理支持TCP和UDP数据传送,同时还支持多种客户验证功能。 不管哪种代理,都要通过一系列协商会话,...

    GoProxy是一款轻量级、功能强大、高性能的http代理、socks5代理、内网穿透代理服务器支持API代理认证,高防服务器

    支持正向代理、反向代理、透明代理、TCP和UDP内网穿透、HTTP和HTTPS内网穿透、https和http代理、socks5代理、负载均衡、TCP/UDP转发、SSH中转、TLS加密传输、协议转换、防污染DNS代理,限速等。

    webservice 网络代理设置实例

    HTTP代理仅适用于HTTP和HTTPS协议,而SOCKS代理则支持多种协议,包括FTP、SMTP等。在调用Web服务时,需要选择与目标服务匹配的代理类型。 3. **认证**:有些代理服务器需要身份验证,这通常涉及到用户名和密码。在...

    wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 负载均衡, 静态文件服务器

    用Rust实现仿nginx,力争实现一个可替代方案,http/https代理, socks5代理, 负载均衡, 反向代理, 静态文件服务器,四层TCP/UDP转发,websocket转发, 内网穿透nat

    java开源包4

    ftp4j提供多种方式连接到远程FTP服务器包括:通过 TCP/IP直接连接,通过FTP代理、HTTP代理、SOCKS4/4a代理和SOCKS5代理连接,通过SSL安全连接。 Java的命令行进度条 JCmdLineProgess JCmdLineProgess 是一个 Java ...

    java开发的代理服务器

    对于HTTP代理来说,监听80端口是常见的,对于SOCKS代理来说,4160端口或更高端口可能是默认配置。连接建立后,代理服务器根据协议和配置转发数据请求到目标服务器,或者执行特定的代理逻辑。 ### 多线程与并发处理 ...

    jargyle:Java SOCKS5服务器

    杰吉尔 Jargyle是Java SOCKS5服务器。 它具有以下功能: SOCKS5协议规范的100%实现,包括和尽管Jargyle可以充当独立的SOCKS5服务器,但它可以充当以下两者之间的桥梁: 使用纯文本连接和无SOCKS5身份验证访问SOCKS5...

    Java网络开发相关源码

    总的来说,这个压缩包提供的源码是学习和理解Java网络编程,特别是Socket通信和SOCKS代理协议的宝贵资源。通过研究这些代码,你可以深入理解如何在Java中实现网络连接,发送和接收数据,以及如何利用SOCKS协议进行...

    JAVA代理服务器

    JAVA,代理服务器,JAVA代理服务器 本小工具是使用JAVA开发的代理服务器,只要设置好代理端口(端口在100~65000之内的任意没被占用的端口都可以),点击启动,局域网内用户就可以设置通过代理联网

    java网络编程 2th源代码

    Java的`Socket`和`ServerSocket`类提供了许多配置选项,如设置超时、启用或禁用SOCKS代理等,以适应各种网络环境和需求。 7. **HTTP协议**: Java网络编程常用于实现HTTP客户端和服务器,理解HTTP的基本概念,如...

    Socks via HTTP 1.2

    官方网站:http://www.socksviahttp.com&lt;br&gt;Socks via HTTP 是一个将 SOCKS 请求 转换为 HTTP 请求 的程序,如果需要的话,还可以设置 HTTP 代理。

    socks_purose.rar_socks

    【标题】"socks_purose.rar_socks" 提到的关键词是 "socks",这通常指的是网络通信中的 SOCKS (Socket Secure) 协议。SOCKS 是一种网络代理协议,...在移动设备上,使用SOCKS代理可以优化网络连接性能,提高游戏体验。

Global site tag (gtag.js) - Google Analytics