自动脚本(pac)和手动设置Proxy的读取方式的java实现(http,tcp)



一概述

本文介绍两种proxy的配置方式以及读取方式的java代码实现

项目中配置Proxy用到了两种方式

1
配置代理服务器

2
使用自动配置脚本,也就是配置pac方式

两种方式的目的都是给本机配置代理服务器,而第二种方式在配置策略上更加灵活

无论使用哪种代理方式,我们讨论的代理类型都为以下三个方式:

DIRECT, HTTP(PROXY), SOCKS

二配置代理服务器

1通过手动方式配置代理服务器.

优点:简单,直观

缺点:适配性差,无法实现策略匹配

2设定规则:

  1. 当同时设定了HTTP和套接字(SOCKET)代理方式,优先读取到HTTP代理
  2. 只有当只设定了SOCKET代理方式,通过代码才能读取到Proxy的type为SOCKS

3读取代理地址方式:

List<String> uriList =newArrayList<String>();//加入不同协议去获取不同的代理的ip,port,type三个参数

//proxytype:http时为Proxy.Type.HTTP,socket时为Proxy.Type.SOCKS

uriList.add("http://www.etnet.com.hk");

uriList.add("socket://www.etnet.com.hk");//只有只设定了套接字代理才能读到

for (String uri : uriList) {//遍历两种协议地址

if
(isSet) {

break;

}

try
{

//ProxySelector的使用方法在http://blog.csdn.net/ustcefish/article/details/41680907

//有说明,用于读取proxy的信息

l = ProxySelector.getDefault().select(new
java.net.URI(uri));

}
catch (URISyntaxException e1) {

e1.printStackTrace();

}

for
(Iterator<Proxy> iter = l.iterator();iter.hasNext();) {

Proxy proxy = iter.next();

InetSocketAddress iNetAddr= (InetSocketAddress) proxy.address();

if
(iNetAddr ==null) {

//com.etnet.utilities.LogUtils.log.info(this,"No
Proxy");

// System.out.println("detected
IE has NoProxy");

// NEED_PROXY = false;

}
else {

// NEED_PROXY = true;

if
(proxy.type() ==Proxy.Type.SOCKS) {

proxyHost
=iNetAddr.getHostName();

proxyPort
=iNetAddr.getPort();

proxyType
="SOCKS";

System.out.println("Found
a SOCKS proxyIP:port=" +proxyHost
+":" +proxyPort);

isSet =
true;

break;

}

if
(proxy.type() ==Proxy.Type.HTTP) {

proxyHost
=iNetAddr.getHostName();

proxyPort
=iNetAddr.getPort();

proxyType
="HTTP";

System.out.println("Found
a HTTP proxyIP:port=" +proxyHost
+":" +proxyPort);

isSet =
true;

break;

}

}

}
// end for

}

三通过自动脚本pac文件设置代理

1通过自动脚本pac文件代理服务器.

优点:适配性强,灵活,可以通过策略实现访问不同域名使用不同代理服务器

缺点:需要了解js脚本

2设定规则:

需要自己写一个js脚本(比如"file://d:/proxy.pac")实现代理服务器选择的不同策略,然后按最上面一个图导入,具体规则请google一下

3读取代理地址方式:

需要导入jre的lib/deploy.jar这个包

BrowserProxyInfo b =
newBrowserProxyInfo();

b.setType(ProxyType.AUTO);

b.setAutoConfigURL("file://d:/proxy.pac");

DummyAutoProxyHandler handler =
newDummyAutoProxyHandler();

try
{

handler.init(b);

}
catch (ProxyConfigException e1) {

//TODO
Auto-generated catch block

e1.printStackTrace();

}

URL url;

try
{

// need add socket

url =
new URL("http://www.etnet.com.hk");

ProxyInfo[] ps =handler.getProxyInfo(url);

for
(ProxyInfo p : ps) {

String[] info =p.toString().split(":");

proxyHost
= info[0];

proxyPort
= Integer.parseInt(info[1]);

}

}
catch (MalformedURLException e) {

//TODO
Auto-generated catch block

e.printStackTrace();

}

四 HTTP链接中使用Proxy

第二部分和第三部分我们知道怎么获取到proxy的信息,第四第五部分我们来看看在HTTP连接和TCP连接时我们如何使用之前获取到的Proxy信息。

  1. 组建一个proxy实例

publicstaticvoid
constructProxy() {

try
{

InetSocketAddress iNetAddr =
new InetSocketAddress(proxyHost,proxyPort);

if
("SOCKS".equals(proxyType))
{

httpProxy
=new Proxy(Proxy.Type.SOCKS,
iNetAddr);

}
elseif
("HTTP".equals(proxyType))
{

httpProxy
=new Proxy(Proxy.Type.HTTP,
iNetAddr);

}

}
catch (IllegalArgumentException ex) {

}

}

  1. 通过Authenticator完成代理的验证

publicstaticclass
CustomAuthenticatorextends Authenticator {

private
StringuserName ="";

private
Stringpassword ="";

public
CustomAuthenticator(StringuserName, String password) {

super();

this.userName
= userName;

this.password
= password;

}

// Called when password authorization is needed

protected
PasswordAuthenticationgetPasswordAuthentication(){

returnnew
PasswordAuthentication(userName,password);

}

}

Authenticator.setDefault(newCustomAuthenticator(prouser,
propass));//关键代码,穿透proxy密码验证

  1. 建立http连接

    urlConnection=(HttpURLConnection)url.openConnection(httpProxy);

五 TCP链接中使用Proxy

  1. 和上面一样组建Proxy实例
  2. 通过Authenticator完成代理的验证
  3. 建立tcp链接

    代码如下:

if (proxy !=null)

tcpSocket
=new Socket(proxy);

Authenticator.setDefault(newCustomAuthenticator(proxyUserName,proxyUserPass));

InetSocketAddress inet =
new InetSocketAddress(IP,PORT);

tcpSocket.connect(inet,TCPCONNECT_TIMEOUT);

时间: 2024-10-08 06:17:44

自动脚本(pac)和手动设置Proxy的读取方式的java实现(http,tcp)的相关文章

Centos网络配置方法(手动设置,自动获取)

一.自动获取IP的方法: 1./ etc/sysconfig/network-scripts/ifcfg-eth0 [[email protected] ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0    //由eth0来启动 HWADDR=00:0C:29:40:EC:61    //MAC地址 TYPE=Ethernet UUID=9c6a7fc6-66ce-406d-993f-6ab26a730e72 ONBOO

在ubuntu设置代理配置自动脚本

在学校使用看Coursera一直都是超级慢的,不知道是不是学校网络的缘故,但是以前用win7看的时候,看到有人说在IE里设置一个代理配置自动脚本上coursera就炒鸡快的了.试验了一下果然快了好多,妈妈再也不用担心我看coursera会卡死了---结果用ubuntu的时候,就又开始卡了...折腾了一会儿...花现其实很简单嘛- 以ubuntu14.04为例,系统设置->网络->网络代理,把方法改成自动,然后再输入如下,速度又是杠杠的了--- 然后再点应用到整个系统,输入密码就完事了---

SQLServer如何手动设置id值(主键)的自动增长

近期做东西,用到了对SQLServer数据库的操作.好吧,确实好久没看了,对这个数据库陌生到了极点,连最简单的如何设置一个id主键,让它随着插入数据的增多,自动增长id值的设置都忘记了,网上查了一下,好多人都说使用代码,好像跟我要的不一样,然后在百度知道找到了答案,虽然有点不好意思,但还是贴出来吧: 问:如何手动设置SQLServer的id(主键),让它随着插入的数据自动增长? 答:点击需要设置的表,点击右键——设计——在列中,点击id——下方出现如下的图: 自增定义: 然后点击确定即可!!!!

从零开始学习音视频编程技术(三) 开发环境搭建(Qt4.86手动设置环境,主要就是设置g++和qmake,比较透彻,附下载链接)

1.先下载安装Qt 我们使用的版本是4.8. 可以自行百度下载也可以从下面的网盘地址下载: Qt库和编译器下载: 链接:http://pan.baidu.com/s/1hrUxLIG 密码:0181 Qt Creator下载: 链接:http://pan.baidu.com/s/1miPgpfi 密码:1hb6 下载后得到这三个文件: 其中 MinGW-gcc440_1.zip 是mingw编译器 qt-win-opensource-4.8.2-mingw.exe 是Qt的库 qt-creato

crontab中运行newLISP脚本的环境变量设置

今天遇到一个问题,在终端里运行newLISP脚本,一切正常,移动到crontab中就不行.即便crontab -e命令运行在同一个用户下,还是有问题. 由于newLISP脚本要用到hive和hadoop,估计是环境变量的问题.所以先用newLISP shell运行(env)命令,将当前环境变量记录到文件evn.lsp中. 然后在newLISP脚本中加载之. 下面是env.lsp文件部分内容: (set 'local-envs '(("LC_PAPER" "en_US.UTF-

虚拟机里CentOS 6.5配置IP地址之一手动设置

虚拟机里CentOS 6.5配置IP地址之一手动设置 1.手动设置  (不使用虚拟机自动获取IP的方法),手动配置方法如下: 虚拟机中系统 输入命令用sudu 或管理权限. #vi /etc/sysconfig/network-scripts/ifcfg-eth0      注释:Vi编辑网卡的配置文件 输入上述命令后回车,打开配置文件,使用方向键移动光标到最后一行,按字母键“i”,进入编辑模式,输入以下内容: IPADDR=192.168.10.11                      

批处理手动设置电脑的ip

参考: http://blog.csdn.net/jiangzhanchang/article/details/7063152 http://wenda.haosou.com/q/1378697364060589 http://blog.sina.com.cn/s/blog_62defbef0101ow9y.html 一.准备编辑器 1.打开notepad++: 2.新建一个空白页面: 3.因为cmd中的编码方式为ANSI,所以设置为ANSI编码 二.输入代码 @echo off :关回显 ec

Spring 3整合Quartz 2实现手动设置定时任务:新增,修改,删除,暂停和恢复----每一个你不满意的当下,都有一个你不曾努力的过去

摘要:在项目的管理功能中,对定时任务的管理有时会很常见.但一般定时任务配置都在xml中完成,包括cronExpression表达式,十分的方便.但是如果我的任务信息是保存在数据库的,想要动态的初始化,还有就是任务较多的时候不是得有一大堆的xml配置?或者说我要修改一下trigger的表达式,使原来5秒运行一次的任务变成10秒运行一次,或者说我要控制定时任务的 “ 暂停 ” 呢?暂停之后又要在某个时间点 “ 重启 ” 该定时任务呢?或者说直接 “ 删除 ” 该定时任务呢?要 改变某定时任务的触发时

备案IP核查自动脚本

我公司使用创旗备案管理系统 近期因管局要求,对所有域名的备案信息进行核查,检查备案信息是否准确,是否存在备案IP不在我公司的域名. 特做此脚本,自动从备案系统数据库中查询出所有备案IP并进行筛选. 此脚本只适用于创旗备案系统V3.0 使用此脚本钱请手动打开备案系统数据库远程访问权限 此脚本为shell脚本,请在linux系统内运行 # 备案准确率查询脚本 # 本脚本通过自动查询自动查询备案系统数据库中的备案域名,备案IP,及备案人的联系信息, # 通过脚本逐行ping测每个域名,并将得出的目标I