代码包含了3种方式的验证
- 通过已获取的文件IP
- 通过生成ip字符串
- 通过代理网站的爬取验证
验证成功的ip保存到一个文件
开启Socket服务器 127.0.0.1:9999
浏览器中访问返回的内容为
var ips = ["210.101.131.229:8080","47.91.138.21:3128"];
var current ;
function FindProxyForURL(url,host){
if(url.indexOf("next")>0){
var len = Math.floor( Math.random() * 2);
current = ips[len];
}
if(url.indexOf("fidder")>0){
current = "127.0.0.1:8888"; //fidder 代理
}
if(url.indexOf("direct")>0){
current = "DIRECT";
}
if(isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0")){//如果是本地主机,localhost 直接连接
return "DIRECT";
}
return "PROXY "+current;
}
function httpGet(callback)
{
var xmlhttp;
if (window.XMLHttpRequest)
{
xmlhttp=new XMLHttpRequest();
}
else
{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
var response = xmlhttp.responseText;
callback.done(response);
}
}
xmlhttp.open("GET","http://localhost:9999",true);// true 异步
xmlhttp.send();
}
该内容是Pac脚本,关于Pac脚本的使用方式请参考其他教程
实现代码
验证ip是否可用的原理非常简单,只需使用代理模拟请求访问某一网站根据服务器返回结果即可判断(当然还有其他方式)
因为当时随便写写就直接用了httpclient,没有再修改,这里推荐使用Okhttp不需要写线程池并发相关的更加简单。
public class IPCheck {
// 代理666的IP提取地址
private static ServerSocket serverSocket = null;// 保证代理服务器只需要一个实例即可
static final int workerNumber = 4;// 线程池保留数量,服务器为8核cpu,合适的数量应该小于8
static final int maxPoolSize = 256;// 最大线程数量,即最大并发量
static final int maxWorkerInQueue = 2500;// 最大工作队列数量
static final int waitTime = 5;// 超时等待时间
private static final ThreadPoolExecutor tpe = new ThreadPoolExecutor(workerNumber, maxPoolSize, waitTime,
TimeUnit.SECONDS, new ArrayBlockingQueue(maxWorkerInQueue));
// 使用上面或下面的线程池
private static ExecutorService executor = Executors.newFixedThreadPool(100);
private static List
代码中使用到的模板代码如下
var ips = #ips#;
var current ;
function FindProxyForURL(url,host){
if(url.indexOf("next")>0){
var len = Math.floor( Math.random() * #len#);
current = ips[len];
}
if(url.indexOf("fidder")>0){
current = "127.0.0.1:8888"; //fidder 代理
}
if(url.indexOf("direct")>0){
current = "DIRECT";
}
if(isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0")){//如果是本地主机,localhost 直接连接
return "DIRECT";
}
return "PROXY "+current;
}
function httpGet(callback)
{
var xmlhttp;
if (window.XMLHttpRequest)
{
xmlhttp=new XMLHttpRequest();
}
else
{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
var response = xmlhttp.responseText;
callback.done(response);
}
}
xmlhttp.open("GET","http://localhost:9999",true);// true 异步
xmlhttp.send();
}