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