aardio 文档

aardio 范例: 多线程端口检测工具

//端口检测
import win.ui;
import win.ui.menu;
import fonts.fontAwesome;
/*DSG{{*/
var winform = win.form(text="多线程端口检测工具";right=757;bottom=474;border="dialog frame";max=false)
winform.add(
btnAdd={cls="button";text="添加";left=435;top=8;right=521;bottom=42;dr=1;dt=1;font=LOGFONT(h=-13);z=6};
btnClip={cls="button";text="自剪贴板批量添加";left=532;top=8;right=729;bottom=42;dr=1;dt=1;font=LOGFONT(h=-13);z=11};
btnTest={cls="button";text="检测";left=492;top=425;right=631;bottom=465;db=1;dr=1;font=LOGFONT(h=-15;name='FontAwesome');z=7};
chkSocks5={cls="checkbox";text="SOCKS5 协议";left=46;top=431;right=222;bottom=463;db=1;dl=1;z=12};
editHost={cls="edit";left=89;top=11;right=287;bottom=35;dl=1;dt=1;edge=1;font=LOGFONT(h=-13);z=2};
editPort={cls="edit";left=346;top=11;right=422;bottom=35;dl=1;dr=1;dt=1;edge=1;font=LOGFONT(h=-13);num=1;z=3};
editTimeout={cls="edit";text="1";left=414;top=431;right=446;bottom=457;db=1;dr=1;edge=1;num=1;z=8};
listview={cls="listview";left=37;top=46;right=733;bottom=415;acceptfiles=1;asel=false;bgcolor=0xFFFFFF;db=1;dl=1;dr=1;dt=1;edge=1;font=LOGFONT(h=-13;name='宋体');fullRow=1;gridLines=1;hscroll=1;msel=false;vscroll=1;z=1};
static={cls="static";text="检测超时:";left=308;top=435;right=405;bottom=459;align="right";db=1;dl=1;dr=1;font=LOGFONT(h=-13);transparent=1;z=9};
static2={cls="static";text="主机:";left=21;top=16;right=74;bottom=35;align="right";dl=1;dt=1;font=LOGFONT(h=-13);transparent=1;z=4};
static3={cls="static";text="端口:";left=290;top=16;right=346;bottom=35;align="right";dl=1;dt=1;font=LOGFONT(h=-13);transparent=1;z=5};
static4={cls="static";text="秒";left=452;top=435;right=478;bottom=459;db=1;dr=1;font=LOGFONT(h=-13);transparent=1;z=10}
)
/*}}*/

winform.listview.insertColumn("主机",200) 
winform.listview.insertColumn("端口",100) 
winform.listview.insertColumn("可用",-1)

import fsys.config;
config  = fsys.config( io.appData("/aardio/tools/tcp-port-test") ); 
if( !config.default.hosts ) {
    config.default.hosts = {}
}

loadHosts = function(){
    winform.listview.clear();
    for i,info in table.eachIndex(config.default.hosts){
        winform.listview.addItem({info.host;tostring(info.port)})
    }
}
loadHosts()

winform.btnAdd.oncommand = function(id,event){
    var host = winform.editHost.text;
    var port = winform.editPort.text;

    if(!#host){
        return winform.editHost.showErrorTip("端口检测工具","请指定主机域名或IP")
    }

    if(!#port){
        return winform.editPort.showErrorTip("端口检测工具","请指定端口")
    }

    table.push(config.default.hosts,{host=host;port=port});
    loadHosts();
}


winform.popmenu = win.ui.popmenu(winform);//创建弹出菜单
winform.popmenu.add('删除',function(id){ 
    table.remove(config.default.hosts,winform.listview.selIndex);
    winform.listview.delItem( winform.listview.selIndex );
});
winform.popmenu.add('全部删除',function(id){ 
    config.default.hosts = []
    winform.listview.clear();
});

winform.listview.onRightClick = function(item,subItem,nmListView){
    var x,y = win.getCursorPos();
    winform.popmenu.popup(x,y,true);//弹出菜单
}

import thread.works;
var works = thread.works( 20,
    function(arguments,...) {
        if(arguments.socks5){
            import wsock.tcp.socks5Client;

            var tickBegin = time.tick(); 
            arguments.ok = wsock.tcp.socks5Client.test(arguments.host,tonumber(arguments.port),arguments.timeout)
            arguments.timeout = time.tick() - tickBegin; 

            return arguments;
        }
        else{
            import wsock.tcp.client; 

            var timeout = 0;
            for(i=1;4;1){
                var client = wsock.tcp.client();    
                var tickBegin = time.tick(); 
                if(client.connectTimeout(arguments.host,tonumber(arguments.port),arguments.timeout)){
                    var ret = client.send("."); 
                    if( ret != 1){ return arguments }
                    timeout =  timeout + (time.tick() - tickBegin);
                }
                else {
                    return arguments;
                } 
            }

            arguments.ok = true;
            arguments.timeout = timeout / 4;
            return arguments;       
        } 
    } 
); 

winform.btnTest.oncommand = function(id,event){

    winform.btnTest.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250'}

    var timeout = tonumber(winform.editTimeout.text);
    for i,info in table.eachIndex(config.default.hosts){  
        info.timeout = timeout;
        info.socks5 = winform.chkSocks5.checked; 
        works.push(info);
    }

    works.wait(function(result){
        for i,info in table.eachIndex(config.default.hosts){ 
            if( (info.host = result.host ) && (info.port = result.port ) ){
                winform.listview.setItemText(result.ok ?( math.round((result.timeout / 1000),2) + "秒") : "连接出错",i,3);
            }
        }   
    })

    winform.btnTest.disabledText = null;
}

winform.btnClip.oncommand = function(id,event){
    import win.clip;
    var txt = win.clip.read();

    if(string.match(txt,"^\s*%\[\]\s*$")){
        import JSON;
        var items = JSON.tryParse(txt);
        if(items){
            for(i,item in items){
                if(item.ip && item.port){
                    table.push(config.default.hosts,{host=item.ip;port=item.port}); 
                }

            }
        }
    }
    else{
        for host,port in string.gmatch(txt,"(\d+\.\d+\.\d+)<\s+>|<\:>(\d+)"){ 
            table.push(config.default.hosts,{host=host;port=port}); 
        }
    }

    config.saveAll();
    loadHosts();
}

import win.ui.grid;
win.ui.grid(winform.listview);

winform.show() 
win.loopMessage();
Markdown 格式