BlogJava上不少朋友是做網(wǎng)管系統(tǒng)的。一個(gè)典型的網(wǎng)絡(luò)管理系統(tǒng),需要具備FCAPS幾個(gè)標(biāo)準(zhǔn)模塊,而網(wǎng)絡(luò)的自動(dòng)發(fā)現(xiàn)和拓?fù)湔故臼呛诵闹弧:芏嗳瞬幌矚gJava的Swing,而本文就用一個(gè)很小很小的例子,來(lái)模擬一個(gè)小小的網(wǎng)絡(luò)管理程序,希望能給大家一點(diǎn)啟發(fā)。雖然很小,它卻可以完成一個(gè)簡(jiǎn)單的局域網(wǎng)自動(dòng)發(fā)現(xiàn)搜索、多線程、ICMP和SNMP的ping、節(jié)點(diǎn)的生成、拓?fù)涞恼故尽⒆詣?dòng)布局等功能。繼續(xù)改巴改巴也許還有點(diǎn)使用價(jià)值也未可知。
如果不喜歡研究代碼,就當(dāng)它是一個(gè)趣味程序吧!你可以在公司的網(wǎng)絡(luò)里面搜索一把,把同事的機(jī)器都挖出來(lái),看看你們公司的網(wǎng)絡(luò)結(jié)構(gòu)是怎樣的;如果喜歡研究代碼,可以看看相關(guān)SNMP、多線程和拓?fù)鋱D展示的部分,雖然很簡(jiǎn)單,就當(dāng)看肥皂劇消遣了。
Ping和SNMP PING
這個(gè)程序的自動(dòng)發(fā)現(xiàn)比較簡(jiǎn)單,就是對(duì)所在的網(wǎng)段進(jìn)行便利搜索。首先,獲得本機(jī)的網(wǎng)址以及所在的網(wǎng)段。例如,如果本機(jī)的地址是192.168.1.122,那么所在的網(wǎng)段自然就是192.168.1.0。然后,將這個(gè)網(wǎng)段中所有可能存在的IP地址進(jìn)行拆分,并通過(guò)多線程進(jìn)行任務(wù)分配,一個(gè)一個(gè)的Ping。
用Java來(lái)Ping機(jī)器,有兩個(gè)做法。一個(gè)是傳統(tǒng)的調(diào)用命令行執(zhí)行Ping命令的做法。這種做法的好處是速度快,比較可靠。缺點(diǎn)是,不同的操作系統(tǒng),甚至Windows的不同版本,其執(zhí)行和返回結(jié)果格式都可能不同,造成跨平臺(tái)的不便以及代碼的啰嗦。第二個(gè)方法自然就是使用大家都熟知的Java 5提供的InetAddress的isReachable方法。這個(gè)方法本來(lái)應(yīng)當(dāng)很好,可是在實(shí)際使用中就會(huì)發(fā)現(xiàn),它不大靈光。超時(shí)時(shí)間設(shè)置短了吧,就ping不through;長(zhǎng)了把,又賊慢。網(wǎng)上不少人都反映和抱怨這個(gè)問(wèn)題。仔細(xì)研究這個(gè)isReachable,會(huì)發(fā)現(xiàn)更多的問(wèn)題。1、它不是線程安全的。也就是說(shuō),為了提高速度而使用多線程進(jìn)行多節(jié)點(diǎn)并行ping,會(huì)導(dǎo)致不安全的返回結(jié)果。這個(gè)問(wèn)題挺致命。2、這個(gè)函數(shù)并非使用ICMP的ping,而是僅僅用TCP連一下7號(hào)端口而已:
寫(xiě)道
又慢又線程不安全就比較不爽了。還可以使用上面提到的JPCAP這個(gè)庫(kù)來(lái)完成。這個(gè)庫(kù)的地址是:
http://netresearch.ics.uci.edu/kfujii/jpcap/doc/
不管怎么說(shuō),一個(gè)小小的ping還是挺麻煩。不過(guò)本例子由于僅僅是示例小程序,還是使用了isReachable方法,簡(jiǎn)化代碼。
在ping通一個(gè)機(jī)器后,接下來(lái)再使用SNMP進(jìn)行ping。做過(guò)SNMP網(wǎng)管的朋友知道,所謂SNMP Ping其實(shí)就是用SNMP去get一個(gè)非常基本的OID看對(duì)方有無(wú)反應(yīng)。如果能夠返回?cái)?shù)據(jù),說(shuō)明這是一個(gè)SNMP節(jié)點(diǎn),可以通過(guò)SNMP配合MIB庫(kù)去獲取更多的業(yè)務(wù)數(shù)據(jù)。例如磁盤(pán)、CPU、內(nèi)存、端口力量等等基本的信息,都有相關(guān)的SNMP MIB進(jìn)行定義。
這個(gè)例子使用了Westhawk’s SNMP stack這個(gè)SNMP協(xié)議棧,一個(gè)輕量的、Java的、開(kāi)源的、免費(fèi)的SNMP協(xié)議棧,實(shí)現(xiàn)了SNMPv1、SNMPv2c以及SNMPv3 (包括MD5和SHA1以及DES, AES加密算法)。地址在這里:
http://snmp.westhawk.co.uk/
使用Westhawk’s SNMP做一個(gè)簡(jiǎn)單的get操作如下:
代碼中用v2c,并假設(shè)community是public,超時(shí)時(shí)間1秒。獲取sysUpTime也就是設(shè)備啟動(dòng)時(shí)間。如果有返回,認(rèn)為節(jié)點(diǎn)存在且SNMP協(xié)議已啟動(dòng)。
本例子就ping這么多。如果做一個(gè)真正的綜合設(shè)備網(wǎng)管,可以先獲得設(shè)備的標(biāo)識(shí)OID,判斷其設(shè)備廠商和型號(hào),然后加載對(duì)應(yīng)設(shè)備支持的MIB進(jìn)行復(fù)雜的監(jiān)控。
多線程任務(wù)
由于一個(gè)網(wǎng)段需要ping的地址很多,一個(gè)線程會(huì)很慢。所以這個(gè)例子中使用很多線程并發(fā)進(jìn)行。例如192.168.1.*里面有254個(gè)可能節(jié)點(diǎn),就用10個(gè)線程去分頭ping然后匯總。這個(gè)讓人想起網(wǎng)絡(luò)螞蟻。于是就做了一個(gè)類似網(wǎng)絡(luò)螞蟻的界面。
其中,每個(gè)球是一個(gè)可能存在的節(jié)點(diǎn)地址。每個(gè)紅色的球是一個(gè)線程正在ping這個(gè)節(jié)點(diǎn)。灰色的球是已經(jīng)被ping過(guò)證明不存在或無(wú)法ping通的地址。綠色球是已經(jīng)ping通,存在的節(jié)點(diǎn)。
通過(guò)調(diào)節(jié)線程的數(shù)量,可以掌握網(wǎng)絡(luò)發(fā)現(xiàn)的速度。一般這254個(gè)節(jié)點(diǎn),可以在30秒到60秒內(nèi)完成。
拓?fù)涑尸F(xiàn)
拓?fù)涑尸F(xiàn)用TWaver就行了。每次發(fā)現(xiàn)一個(gè)存在的節(jié)點(diǎn),往Network中new一個(gè)Node,設(shè)置一個(gè)圖標(biāo)即可。同時(shí),在網(wǎng)段節(jié)點(diǎn)(一個(gè)云形圖標(biāo)的節(jié)點(diǎn))和計(jì)算機(jī)節(jié)點(diǎn)創(chuàng)建一個(gè)連線。
同時(shí),把拓?fù)鋱Dnetwork組件的彈簧布局打開(kāi)。這樣,每次節(jié)點(diǎn)加入,都會(huì)像彈簧一樣被自動(dòng)布局到合適的位置,比較動(dòng)感、有視覺(jué)效果。
另外,一旦ping通,我們?cè)诠?jié)點(diǎn)上就顯示一個(gè)windows圖標(biāo);如果snmp能ping通,再顯示一個(gè)齒輪的圖標(biāo)。顯示效果如下:
顯示圖標(biāo)的代碼很簡(jiǎn)單:
此外,可以通過(guò)windows的“net view hostname”的命令來(lái)查看一個(gè)機(jī)器的共享信息。我們做一個(gè)右鍵菜單,將執(zhí)行命令結(jié)果顯示出來(lái):
顯示結(jié)果如下:
結(jié)果顯示,這臺(tái)test計(jì)算機(jī)上有“move”、“SharedDocs”兩個(gè)共享目錄,以及三個(gè)共享打印機(jī)。實(shí)現(xiàn)的代碼如下:
鏈路探測(cè)與告警
在所有的節(jié)點(diǎn)被探索結(jié)束并放入界面后,我們可以起一個(gè)線程,周期性對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行ping。一旦無(wú)法ping通,生成告警,顯示在拓?fù)鋱D中。
將告警放置在一個(gè)告警表格中: 同時(shí),讓告警表和拓?fù)鋱D共享一個(gè)DataBox,于是告警就會(huì)在拓?fù)渲酗@示:
最終效果以及源代碼下載
這是用這個(gè)小程序探索我們辦公室的網(wǎng)絡(luò)結(jié)構(gòu)。你的呢?也可以發(fā)上來(lái)看看!
源代碼、第三方lib包、可執(zhí)行包、run.bat都在附件中,請(qǐng)大家自行下載。請(qǐng)確保安裝了JAVA 6。解壓后雙擊run.bat即可。在彈出的對(duì)話框中點(diǎn)擊start按鈕即可進(jìn)行網(wǎng)絡(luò)自動(dòng)發(fā)現(xiàn)。
源代碼和可執(zhí)行文件點(diǎn)擊下載
snmp_demo.zip
GOOD LUCK & HAVE FUN!
Powered by: BlogJava Copyright © TWaver