一个用来扫描主机端口的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
}
}
}
--------------------------------------------------------------------------
<?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
}
}
}
相关文章推荐
- 一个简单的端口扫描程序
- Linux中实现一个目录扫描程序
- c语言实现端口扫描程序
- 一个简单的端口扫描程序
- Nginx实现多个站点使用一个端口(配置Nginx的虚拟主机)
- 练练手,近期实现的一个基于alpha-beta剪枝技术的机器人“追逐”程序
- 一个简单的端口扫描程序
- 通过主机标头实现多个SharePoint Web应用程序共用一个端口
- c# 实现端口转发可以用来实现远程桌面连接内网主机
- Linux中实现一个目录扫描程序
- 主机扫描程序实现方法
- 一个简单的端口扫描程序题
- Nginx实现多个站点使用一个端口(配置Nginx的虚拟主机)
- Python实现对一个网络段扫描及端口扫描
- Nginx实现多个站点使用一个端口(配置Nginx的虚拟主机)
- 一个简单的端口扫描程序
- secureCRT中实现一个脚本VBScript, 用来让连接到主机的测试板子一直run一条指令。
- Flex AIR程序实现多任务即同时打开多个相同应用ID的AIR程序,如QQ多登录
- Nginx实现多个站点使用一个端口(配置Nginx的虚拟主机)
- c++ 端口扫描程序实现案例