您的位置:首页 > 大数据 > 人工智能

一个用来扫描主机端口的AIR 程序 (在Flex 4+AIR 2.0/Beta 2 下实现)

2010-04-07 23:05 567 查看
[本程序写于2010-3-15,发布到博客前做了整理。本想上传fxp项目文件,因不懂CSDN的博客如何上传附件,只好作罢。有兴趣一起探讨的,发邮件给作者:chenchuangjian@gmail.com]

--------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>

<!--本程序用来扫描给定主机的指定范围的端口,连接成功的端口将显示在屏幕正中的大文本区中-->

<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"

xmlns:s="library://ns.adobe.com/flex/spark"

xmlns:mx="library://ns.adobe.com/flex/mx">

<fx:Script>

<![CDATA[

impor
t flash.events.Event;

import flash.events.IOErrorEvent;

import flash.events.ProgressEvent;

import flash.net.Socket;

import flash.utils.ByteArray;

import flash.utils.clearTimeout;

import flash.utils.setTimeout;

import mx.events.FlexEvent;

import mx.events.ModuleEvent;

import mx.modules.ModuleL
oader;

import mx.utils.StringUtil;

private var socket:Socket;

private var p:int;

private var testTimes:int=10;

private var toStop:Boolean=false;

private var timeoutId:uint;

private var appWin:NativeWindow;

private var startTime:Number;

private var intervalId:uint;

private var lastPort:Object={socket:null,timeoutId:null};

private function scan(e:Event):void

{

toStop=false;

MyUtils.showLog(log,'开始扫描...');

startTime=new Date().getTime();

if(startPort.text>'') p=int(startPort.text) else p=1;

if(times.text>'') testTimes=int(times.text);

intervalId=setInterval(showElapsedTime,200,elapsedTime);

connect(p);

}

private function connectEventHandler(e:Event):void

{

var s:Socket=e.target as Socket;

MyUtils.showLog(log,'连接成功 ('+s.remoteAddress+':'+s.remotePort+')');

connect(++p);

}

private function dataEventHandler(e:ProgressEvent):void

{

var s:Socket=e.target as Socket;

var bytes:ByteArray=new ByteArray();

s.readBytes(bytes);

MyUtils.showLog(log,bytes.toString());

}

private function errorHandler(e:IOErrorEvent):void

{

showStatus('连接端口 '+p+' 失败.');

connect(++p);

}

private function connect(p:int):void

{

if(toStop)

{

MyUtils.showLog(log,'已中断扫描');

clearTimeout(timeoutId);

clearInterval(intervalId);

return;

}

var maxPort:int=int(startPort.text)+testTimes-1

if (p>maxPort)

{

MyUtils.showLog(log,'共扫描了 '+testTimes+' 个端口。');

clearTimeout(timeoutId);

clearInterval(intervalId);

return;

}

try

{

showStatus('尝试连接端口 '+p+'...');

var socket:Socket=new Socket();

socket.timeout=1000;

configEvents(socket);

socket.connect(host.text,p);

timeoutId=setTimeout(cancelConnect,Number(timeout.text),socket,timeoutId);

lastPort.socket=socket;

lastPort.timeoutId=timeoutId;

}

catch(e:Error)

{

showStatus('re-connect error:'+e.message);

stopScan();

}

}

private function configEvents(socket:Socket):void

{

if(socket)

{

socket.addEventListener(Event.CONNECT,connectEventHandler);

socket.addEventListener(ProgressEvent.SOCKET_DATA,dataEventHandler);

socket.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);

socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);

}

}

private function stopScan():void

{

toStop=true;

MyUtils.showLog(log,"正在中断扫描...");

clearTimeout(timeoutId);

clearInterval(intervalId);

if(lastPort.socket) lastPort.socket.close();

}

private function cancelConnect(s:Socket,timeId:uint):void

{

try

{

if(s) s.close();

clearTimeout(timeId)

}

catch(e:Error)

{

trace(e.message)

}

}

private function update(e:FlexEvent):void

{

var ta:TextArea=e.target as TextArea;

ta.setSelection(ta.text.length-1,ta.text.length)

}

private function showStatus(msg:String):void

{

status=msg;

}

private function formatTime(interval:Number):String

{

var _interval:Number=interval;

var miliseconds:Number=interval % 1000; //微秒段;

_interval=(_interval-miliseconds)/1000; //剩余部分转为秒;

var seconds:Number=_interval % 60; //秒段;

_interval=(_interval-seconds)/60; //剩余部分转为分钟

var minutes:Number=_interval % 60; //分钟段

var hours:Number=(_interval-minutes)/60;; //剩余部分转为小时,即小时段

return zeroPrefixNumber(hours,2)+':'+zeroPrefixNumber(minutes,2)+':'+zeroPrefixNumber(seconds,2)+'.'+zeroPrefixNumber(miliseconds,3)

}

private function showElapsedTime(dashBoard:Object):void

{

var endTime:Number=new Date().getTime();

var interval:Number=(endTime-startTime) ;

dashBoard["text"]=MyUtils.timeBoard(interval);

}

private function zeroPrefixNumber(n:Number,len:uint):String

{

var s:String=StringUtil.repeat('0',len);

s=s+n;

return s.substr(s.length-len,len)

}

]]>

</fx:Script>

<s:VGroup width="100%" height="100%"

horizontalCenter="0" top="20" horizontalAlign="center" gap="15">

<s:HGroup verticalAlign="middle">

<s:Label text="主机(IP/域名):"/>

<s:TextInput id="host" text=""/>

<s:Label text="开始端口:"/>

<s:TextInput id="startPort" text="1" width="60"/>

<s:Label text="扫描数量:"/>

<s:TextInput id="times" text="1024" width="60"/>

<s:Label text="超时标准(毫秒):" />

<s:TextInput id="timeout" text="1000" width="60"/>

<s:Label text="耗时:"/>

<s:TextInput editable="false" id="elapsedTime" width="100" textAlign="center"/>

</s:HGroup>

<s:HGroup verticalAlign="middle">

<s:Button id="scanBtn" label="扫描" click="scan(event)"/>

<s:Button id="closeBtn" label="停止" click="stopScan()"/>

</s:HGroup>

<mx:TextArea id="log" width="80%" height="80%" updateComplete="update(event)"/>

<s:Button label="清除" click="{log.text=''}" />

</s:VGroup>

</s:WindowedApplication>

----------------------------------------------------------------------

库文件:MyUtils.as的源码如下:

// ActionScript file

package

{

import flash.net.Socket;

//import flash.filesystem.*;

import flash.utils.ByteArray;

import mx.utils.StringUtil;

public class MyUtils

{

public function MyUtils()

{

}

public static function Date2Str(d:Date,s:String='-'):String

{

return ''+d.fullYear+s+(d.month+1)+s+d.date+' '+d.hours+':'+d.minutes+':'+d.seconds ;//+'.'+d.milliseconds

}

public static function showLog(log:Object,s:String):void

{

if(log)

log.text+='【'+MyUtils.Date2Str(new Date())+'】'+s+'/n'

}

public static function str2bytes(s:String):ByteArray

{

var b:ByteArray=new ByteArray();

b.writeUTFBytes(s);

return b;

}

public static function ipPort2Id(ip:String,port:int):String

{

return ip.replace(//./g,'').replace('127001','100721')+port;

}

public static function writeToSocket(socket:Socket,ba:ByteArray):void

{

try {

socket.writeBytes(ba);

socket.flush();

}

catch (error:Error)

{

trace(error.message);

}

}

public static function writeObjectToSocket(s:Socket,o:Object):Boolean

{ var r:Boolean;

try

{

//s.writeMultiByte(msg+'/n','utf-8');

s.writeObject(o)

s.flush();

r=true

}

catch (e:Error)

{

// MyUtils.showLog(log,"sendToClient: "+e.message)

r=false

}

return r

}

public static function zeroPrefixNumber(n:Number,len:uint):String

{

var s:String=StringUtil.repeat('0',len);

s=s+n;

return s.substr(s.length-len,len)

}

public static function timeBoard(interval:Number):String

{

var _interval:Number=interval;

var miliseconds:Number=interval % 1000; //计算微秒段;

_interval=(_interval-miliseconds)/1000; //剩余部分转为秒;

var seconds:Number=_interval % 60; //计算秒段;

_interval=(_interval-seconds)/60; //剩余部分转为分钟

var minutes:Number=_interval % 60; //分计算钟段

var hours:Number=(_interval-minutes)/60;; //剩余部分转为小时,即小时段

return zeroPrefixNumber(hours,2)+':'+zeroPrefixNumber(minutes,2)+':'+zeroPrefixNumber(seconds,2)+'.'+zeroPrefixNumber(miliseconds,3)

}

public static function trim(s:String):String

{

return StringUtil.trim(s);

}

public static function parseCommand(cmd:String):Object

{

var retO:Object={command:'',parameters:[]};

var _cmd:String=MyUtils.trim(cmd);

var pos:int=_cmd.indexOf(' ');

if(pos>0)

{

retO.command=_cmd.substr(0,pos);

_cmd=_cmd.substr(pos,_cmd.length).replace(/ /g,'').replace(/,/g,',');

var a:Array=_cmd.split(',');

if(a)

retO.parameters=a;//.map(function(e:String,i:int,a:Array){return MyUtils.trim(e)})

}

else

retO.command=_cmd;

return retO

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: