文档章节

说说gogoTester-nodejs 的实现

subying
 subying
发布于 2015/05/31 10:12
字数 1334
阅读 117
收藏 0

    一直在使用goagent,所以对于查找google可用ip有了很大的兴趣,在github上面发现有一个项目是gogoTester,是用来查找google ip的,于是突发奇想自己用nodejs写了一个,为gogoTester-nodejs,用nodejs实现查询google可用ip。gogoTester-nodejs 跟 gogoTester其实没有啥联系,除了使用一样的ip range(ip 段范围),其他的都是自己折腾出来的,因为gogoTester是用c#写得,看得不懂...

    git项目地址为:osc@git https://git.oschina.net/subying/gogoTester-nodejs ;github:https://github.com/subying/gogoTester-nodejs

    其实实现起来并不难,毕竟菜鸟。实现的方式可以能会有多种,但是流程应该是差不多,这也是一个很傻瓜化的方式,就是拿到一堆google可能会用到的ip段,然后逐个去测试,测试通过的就是可用的ip,至少能够通过这个ip直接访问google了,可以分一下几步来实现:

    1.找到可用的ip 段    

    我承认我也不知道,所以我直接拿的是别人的,直接从gogoTester那里拿到了,然后转换成了数组,在我git项目中的ip.js可以看到,以后扩展也是通过维护这个文件。其中的代码是这样的方式

var iptables = [];
iptables.push("1.179.248.0-255");
iptables.push("1.179.249.0-255");
iptables.push("1.179.250.0-255");
    数组里面的每一项是用ip段和范围组成的,“1.179.248.0-255 ”表示1.179.248.0-1.179.248.255这样的Ip段范围,所以需要一个转换的方法。

    2.把数组中的每一项转成对应的ip段

    “1.179.248.0-255”表示1.179.248.0-1.179.248.255这样的Ip段范围 ,那么就用split方法把字符串分成四段,最后一段是范围值,可以这样做:

checkStr:function(str){//检查并转换
        var arr = str.split('.')
            ,_ipStr = arr[0]+'.'+arr[1]+'.'+arr[2]+'.'
            ,_range = arr[3].split('-')
            ,_start = _range[0] || 1
            ,_end = _range[1]
            ,i = _start
            ,_self = this
        ;
        _self._ipStr = _ipStr;
        for(;i<_end;i++){
            _self.pushTask(i);
        }
    }

    这样通过最后的一段循环,把需要查询的ip给记录下来。

    3.   测试的方法

    拿到需要查询的Ip后就是进行测试了,我这里用的是简单的http请求,通过判断返回的是否为'gws'(google服务器)来判断是否为google ip。方法里面还设置了超时,毕竟大家都不想访问一个太卡的Ip,所以设置了请求响应的时间,方法如下

function httpGet(ip,cb){
    var req = http.get('http://'+ip)
        ,err=false
    ;

    function endAysnc(){
        req.abort();

        if(!err){
            err = true;
            cb();
        }
    }

    req.on('response',function(res){
        //修改了判断,直接用header信息中server的判断,加快了判断速度
        if(res.headers.server === 'gws'){
            checkIpPad.addGoodIp(ip);
        }
        res.destroy();

        endAysnc();
    })
    .on('error',function(err){
        endAysnc();
        //throw err;
    })
    .setTimeout(checkIpPad.timeout,function(){
        endAysnc();
    });

    return req;
}

    4.执行测试的控制

    nodejs的http请求都是异步的,如果你不控制请求的数量,我保证你的程序很快就挂掉了,那么就需要控制同时执行的任务数量,我这里用的是async模块,这是一个很不错的模块,这里就不介绍了,大家可以搜索来了解,方法如下:

var q = async.queue(function(task, callback) {
    util.log('worker is processing task: '+task.name);
    task.run(callback);
}, checkIpPad.threadNum);
/**
* 监听:如果某次push操作后,任务数将达到或超过worker数量时,将调用该函数
*/
q.saturated = function() {
    util.log('all workers to be used');
}

/**
* 监听:当最后一个任务交给worker时,将调用该函数
*/
q.empty = function() {
    util.log('no more tasks wating');
}

/**
* 监听:当所有任务都执行完以后,将调用该函数
*/
q.drain = function() {
    checkIpPad.finishTask();
}

    5.测试顺序的方式

    ip.js文件里面包含的ip段就有2000多,每个ip段里面包含了一个范围,也就是有多个ip,这样下来就会有很多ip需要测试了,这个时候需要考虑测试的方式。当然最简单的就是从头到尾测试,这是最直接的方法,但是这样可能耗时会比较多。我这里还用了一个随机测试的方法,主要是数组长度范围内的随机数,然后再去找到这个对应的Ip段,再去测试里面的Ip,需要注意的是要防止重复

,randomCheck:function(){//随机查询
        var _self = this
            ,_num = _self.getRandom(0,_self.len-1)
            ,_str = _self.arr[_num];
        ;
        _self.checkType='random';
        _self.index = _num;
        _self._cacheIndex = _self._cacheIndex + '_'+_num+'_';

        _self.checkStr(_str);
    }
    ,listCheck:function(){//顺序查找
        var _self = this
            ,_num = _self.isInit?_self.index+1:_self.index
            ,_str
        ;
        if(_num>=_self.len){
            return false;
        }

        _self.checkType='list';
        _self.index = _num;
        _str = _self.arr[_num];
        _self.checkStr(_str);
    }
    ,getRandom:function(t1,t2){//获取随机数
    	var _self = this
    		,_num = Math.floor(Math.random()*(t2-t1)+t1)
    		,_flag = true
    		,_cache = _self._cacheIndex
    	;
    	while(_flag){
    		if(_cache.indexOf('_'+_num+'_')===-1){
    			_flag = false;
    		}else{
    			_num = Math.floor(Math.random()*(t2-t1)+t1);
    		}
    	}
        return _num;
    }

    这里看到了随机测试和顺序测试的方法,经过本人测试,发现随机测试平均耗时会更少一些,不过话说是靠人品的...

    实现的方式就是这样,里面主要是用到了Ip段、http请求、async控制和随机测试,感兴趣的朋友可以了解一下。另外,我用到的Http请求的方式是不够严谨的,因为google用的是https协议,所以用Https会更好,但是我目前还没有实现,希望已经实现的朋友能给我一些帮助。

    本文同步发表在我的个人博客:http://www.subying.com/archives/125.html

© 著作权归作者所有

共有 人打赏支持
subying
粉丝 21
博文 63
码字总数 35388
作品 0
广州
前端工程师
私信 提问
redis主动向页面push数据

对于页面上定时刷新显示的数据,之前一直都是比较“传统”的思想——那就是“页面通过ajax请求后台,后台响应后把数据返回给前台展示,如此反复……”,而自己也从来没有过“服务端主动向页面...

引鸩怼孑
2015/07/05
0
0
Java 能抵挡住 JavaScript 的进攻吗?

作者 | 刘欣 本文经授权转自公众号“码农翻身” JavaScript 的进攻 公元 2014 年,Java 第八代国王终于登上了王位。 第一次早朝,国王坐在高高的宝座上,看着毕恭毕敬的大臣,第一次体会到了...

CSDN资讯
02/08
0
0
起征点5000,社保按工资实缴,你看好996加班加点挣钱买房落户40年后领钱吗

from http://money.163.com/18/0902/08/DQMF2TP100258105.html 烧饼从5毛涨到4块5 房子从3000涨到3w 工资从3000涨到15000 起征点从3500涨到5000 (看好php && 不看好nodejs || 看好nodejs &&...

yak
2018/09/02
8.1K
23
Node.js非阻塞IO和事件循环学习总结

  学习和使用Node.js已经有两个月,使用express结合mongoose写了一个web应用和一套RESTful web api,回过头来看Node.js官网首页对Node.js的介绍:Node.js uses an event-driven, non-block...

LeoG0816
2014/09/14
0
10
请问为什么用Node.js自带的npm包管理器安装软件总是遇到各种问题?

请问为什么用Node.js自带的npm包管理器安装软件总是遇到各种问题?请问有没有人遇到以下错误,该如何解决,麻烦指点下小白我,先说说谢谢了。 我用npm包安装babel-cli时出现下来问题,请问这...

alphat
2016/12/13
699
2

没有更多内容

加载失败,请刷新页面

加载更多

容器服务

简介 容器服务提供高性能可伸缩的容器应用管理服务,支持用 Docker 和 Kubernetes 进行容器化应用的生命周期管理,提供多种应用发布方式和持续交付能力并支持微服务架构。 产品架构 容器服务...

狼王黄师傅
昨天
3
0
高性能应用缓存设计方案

为什么 不管是刻意或者偶尔看其他大神或者大师在讨论高性能架构时,自己都是认真的去看缓存是怎么用呢?认认真真的看完发现缓存这一块他们说的都是一个WebApp或者服务的缓存结构或者缓存实现...

呼呼南风
昨天
12
0
寻找一种易于理解的一致性算法(扩展版)

摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可...

Tiny熊
昨天
2
0
聊聊GarbageCollectionNotificationInfo

序 本文主要研究一下GarbageCollectionNotificationInfo CompositeData java.management/javax/management/openmbean/CompositeData.java public interface CompositeData { public Co......

go4it
昨天
3
0
阿里云ECS的1M带宽理解

本文就给大家科普下阿里云ECS的固定1M带宽的含义。 “下行带宽”和“上行带宽” 为了更好的理解,需要先给大家解释个词“下行带宽”和“上行带宽”: 下行带宽:粗略的解释就是下载数据的最大...

echojson
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部