JAVA使用Internet代理设置
描述:首先获取注册表Internet设置,然后初始化代理服务器。
/** * Copyright (c) 2012 Trusted Software and Mobile Computing(TSMC) * All right reserved. * * Created on Apr 24, 2012 12:42:24 PM * http://jarg.iteye.com/ * Author: Jarg Yee <[email protected]> */ package com.iteye.jarg.monitor.util; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.Properties; import com.ice.jni.registry.RegDWordValue; import com.ice.jni.registry.Registry; import com.ice.jni.registry.RegistryKey; import com.ice.jni.registry.RegistryValue; /** * TODO 使用代理服务器工具类 * 2012-04-25 11:49 */ public class ProxyUtil { /** 获取系统配置句柄 */ private static final Properties prop = System.getProperties(); /** 注册表中Internet表项位置 */ private static final String Internet = "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"; /** 初始化代理 from Internet Settings */ public static void initProxy() { try { // 注册表表项值 RegistryKey registryKey = Registry.openSubkey(Registry.HKEY_CURRENT_USER, Internet, RegistryKey.ACCESS_READ); // 注册表表项键 RegistryValue registryValue = registryKey.getValue("ProxyEnable"); boolean proxyEnable = ((RegDWordValue) registryValue).getData() != 0; // 代理设置是否开启 // System.out.println("IE 是否启用了代理设置: " + proxyEnable); if (proxyEnable == true) // 开启了Internet代理 { registryValue = registryKey.getValue("ProxyServer"); String proxyServer = new String(registryValue.getByteData()); ProxyUtil.initProxy(proxyServer); System.out.println("使用IE代理服务器."); } } catch (Exception e) { System.out.println("ERROR:操作Windows注册表失败."); // e.printStackTrace(); } } /** * 初始化代理 * @param proxyServer form Internet * */ public static void initProxy(String proxyServer) { // System.out.println("proxyServer:" + proxyServer + "\nlength:" + proxyServer.split(";").length); String[] proxy = proxyServer.split("=|;|:"); if(proxy.length == 1)// IP地址不同,但端口默认的代理初始化 { initProxy(proxyServer); initProxyFtp(proxyServer, "2121"); initProxyGopher(proxyServer, "808"); initProxyHttp(proxyServer, "808"); initProxyHttps(proxyServer, "443"); initProxySocks(proxyServer, "1080"); } else if(proxy.length == 2) { initProxy(proxy[0], proxy[1]); // 统一代理初始化,所有协议使用相同的代理服务器 } else { for(int i=0; i<proxy.length; i=i+3) { initProxy(proxy[i], proxy[i+1], proxy[i+2]); // 独立代理初始化 } } } /** 独立代理初始化 */ private static void initProxy(String proxyPotocol, String proxyIP, String proxyPort) { // System.out.println("proxyPotocol:" + proxyPotocol); String[] potocol = {"ftp", "gopher", "http", "https", "socks"}; if(proxyPotocol.equals(potocol[0])) { initProxyFtp(proxyIP, proxyPort); // 初始化FTP代理 } else if(proxyPotocol.equals(potocol[1])) { initProxyGopher(proxyIP, proxyPort); // 初始化GOPHER代理 } else if(proxyPotocol.equals(potocol[2])) { initProxyHttp(proxyIP, proxyPort); // 初始化HTTP代理 } else if(proxyPotocol.equals(potocol[3])) { initProxyHttps(proxyIP, proxyPort); // 初始化HTTPS代理 } else if(proxyPotocol.equals(potocol[4])) { initProxySocks(proxyIP, proxyPort); // 初始化SOCKS代理 } } /** * 初始化FTP代理 * */ private static void initProxyFtp(String proxyIP, String proxyPort) { // 使用ftp代理服务器的主机、端口以及不需要使用ftp代理服务器的主机 prop.setProperty("ftp.proxyHost", proxyIP); prop.setProperty("ftp.proxyPort", proxyPort); prop.setProperty("ftp.nonProxyHosts", "localhost|10.10.*"); } /** * 初始化GOPHER代理 * */ private static void initProxyGopher(String proxyIP, String proxyPort) { prop.setProperty("gopher.proxyHost", proxyIP); prop.setProperty("gopher.proxyPort", proxyPort); } /** * 初始化HTTP代理 * */ private static void initProxyHttp(String proxyIP, String proxyPort) { // 设置http访问要使用的代理服务器的地址 prop.setProperty("http.proxyHost", proxyIP); // 设置http访问要使用的代理服务器的端口 prop.setProperty("http.proxyPort", proxyPort); // 设置不需要通过代理服务器访问的主机,可以使用*通配符,多个地址用|分隔 prop.setProperty("http.nonProxyHosts", "localhost|10.10.*"); } /** * 初始化HTTPS代理 * */ private static void initProxyHttps(String proxyIP, String proxyPort) { // 设置安全访问使用的代理服务器地址与端口 // 它没有https.nonProxyHosts属性,它按照http.nonProxyHosts 中设置的规则访问 prop.setProperty("https.proxyHost", proxyIP); prop.setProperty("https.proxyPort", proxyPort); // 设置不需要通过代理服务器访问的主机,可以使用*通配符,多个地址用|分隔 prop.setProperty("http.nonProxyHosts", "localhost|10.10.*"); } /** * 初始化SOCKS代理 * */ private static void initProxySocks(String proxyIP, String proxyPort) { // socks代理服务器的地址与端口 prop.setProperty("socksProxyHost", proxyIP); prop.setProperty("socksProxyPort", proxyPort); } /** 统一代理初始化 */ public static void initProxy(String IP, String port) { initProxy(IP); initProxyFtp(IP, port); initProxyGopher(IP, port); initProxyHttp(IP, port); initProxyHttps(IP, port); initProxySocks(IP, port); } /** * 使用代理 * */ private static void testProxy() throws IOException { /** 使用代理连接网络 */ URL url = new URL("http://www.baidu.com/"); URLConnection conn = url.openConnection(); conn.setConnectTimeout(3000); InputStream in = conn.getInputStream(); BufferedInputStream bin = new BufferedInputStream(in); byte[] buf = new byte[1024]; // 缓存连网获得的数据 while (bin.read(buf) > 0) { System.out.print(new String(buf, "GBK")); } System.out.println(); } /** * for debugging. * * @throws IOException */ public static void main(String[] args) throws IOException { initProxy(); // 初始化代理 testProxy(); // 使用代理 } }