引用:http://school.cfan.com.cn/soft/sys/2006-08-18/1155878337d13185.shtml
前言 常言道,攘外必先安内,服务器的正常运作,是开展一切工作的基础。而在网络安全问题日益凸现的今天,监控服务器的健康状况成了管理人员的必修课。然而,通过手工操作效率过于低下。想到骇客帝国中帅呆了的Agent史密斯,其本质就是一个高级的软件机器人,那么我们能不能编写一套程序,让程序就像Agent史密斯一样自动去监视服务器的健康状况,一旦发现问题就自动通知我们呢? 要编写这么一个软件机器人,我们只要通过程序定时测试网站是否正常运行即可。其实原理并不复杂,因为用Inet控件去抓取一个Url地址时,如果地址是无法访问的,Inet控件所返回的值的长度是0。如果用循环和数组,程序还能同时监测多个网址。此外,还可以用Dir函数、Windows Script Host对象等实现从收藏夹中导入链接,使软件操作更加友善。 程序设计 以下便是笔者用Visual Basic 6编写的网站监视软件。程序需要5个按钮,作用分别是:开始监视、结束监视、添加Text1中的网址至监视列表、从监视列表中移除网址和从收藏夹列表中添加网址到监视列表;一个Inet控件(需要从工程-部件中选择),RequestTimeout设置为15(请依据个人网速设置,建议大于15);三个Listbox分别为:记录监视记录、待监视网址列表、显示收藏夹中的链接列表;两个Text框分别为:用户输入网址、显示List2中选中网址的监视信息;一个Timer控件,Enabled设置为False,Interval设置为1000。 篇幅限制,下面只列出核心代码: Private Sub Form_Load() 'Form加载时读取收藏夹中的链接 Dim sA As String * 65400 Dim sfile As String Dim fpath As New IWshRuntimeLibrary.WshShell sfile = Dir(fpath.SpecialFolders("FAVORITES") & "\") '用Windows Script Host对象获得当前收藏夹位置 Do While Not Len(sfile) = 0 If UCase(Right(sfile, 4)) = ".URL" Then Open fpath.SpecialFolders("FAVORITES") & "\" & sfile For Binary As #1 '注释:用二进制打开文件 Get #1, , sA '注释:用Get语句从文件中获取字节 xz = Split(sA, Chr(10)) '以回车作为标志分割URL中文本 For i = 0 To UBound(xz) If UCase(Left(xz(i), 4)) = "URL=" Then '符合格式时得到Url List3.AddItem Right(xz(i), Len(xz(i)) - 4) End If Next i Close #1 '注释:关闭文件 End If sfile = Dir Loop End Sub
Private Sub Timer1_Timer() '启动监视的时候Timer执行 On Error Resume Next '先忽略一切错误,为了能够让程序执行下去 If Inet1.StillExecuting Then Inet1.Cancel For i = 0 To List2.ListCount - 1 '循环次数等于列表中待监测链接数 val = 0 val = Len(Inet1.OpenURL(List2.List(i))) '网址返回的长度 If val = 0 Then 'Inet返回值的长度为零,则记录无法访问 List1.AddItem (Now & Space(6) & List2.List(i) & Space(6) & "×") c2(i) = c2(i) + 1 '不能访问计数+1 Else List1.AddItem (Now & Space(6) & List2.List(i) & Space(6) & "√") '反之,记录可以访问 c1(i) = c1(i) + 1 '能访问计数+1 End If Next i List1.AddItem Chr(10) If List2.SelCount > 0 Then '在Text2中显示监测结果 Text2.Text = "当前统计信息:" & Chr(10) & List2.List(List2.ListIndex) & Space(6) & "正常访问:" & c1(List2.ListIndex) & "次" & Space(6) & "不能访问:" & c2(List2.ListIndex) & "次" End If End Sub 注意到本文通过Timer控件与Inet控件的结合非常巧妙地模仿了多线程的机制,程序反应速度非常快,如图所示就是程序运行的界面。
需要注意的是,不同网站访问速度不同,按本文方法,只有被测网址在Inet的RequestTimeout时间内刷新完才记录正常访问,如果网速过慢,需加大RequestTimeout的值(只要不要超过Timer的Interval时间),否则软件机器人会出现误报。 后记 本文通过VB自带的Inet控件以及简单的循环便实现了一个非常实用的软件机器人,服务器的任何问题都逃不过它的眼睛。如果对于Inet控件返回的内容加以判断,还可以开发出能够监视网络连载故事是否更新的软件机器人。此外,验证自己购买的虚拟主机是否真的有如广告说的那样不间断服务,对于我们的软件机器人而言,绝对是小菜一碟。 本程序在VB6.0、Windows XP联网状态下调试通过。完整的源代码可以从http://www.cfan.com.cn/11program/200514/agent.zip下载
|