1. JAVA還沒有API可以做到。
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供潁州網(wǎng)站建設(shè)、潁州做網(wǎng)站、潁州網(wǎng)站設(shè)計、潁州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、潁州企業(yè)網(wǎng)站模板建站服務(wù),十載潁州做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
2. 可以通過腳本等到主機的網(wǎng)絡(luò)流量:windown使用wmi,linux使用命令(watch -n 1 "/sbin/ifconfig eth0 | grep bytes")。
3. 另外就是SNMP協(xié)議,通過對于的MID獲得主機或者網(wǎng)絡(luò)設(shè)備的流量。
java有個開源的實現(xiàn)叫做SNMP4J,你可以google “SNMP4J 網(wǎng)絡(luò)流量”搜索到大量信息。(
使用SNMP輪詢做實事流量監(jiān)控的頻率不要太高,否則會有負載問題。)
網(wǎng)絡(luò)使用率這個功能,和偏硬件一些,用C++編程較為合適。
如果非要用Java來編程的話,需要用C++編一些動態(tài)鏈接庫文件,和Java結(jié)合起來用。
或者,樓主可以看看,有沒有現(xiàn)成的開源項目或者鏈接庫可以使用。
可以借助第三方軟件,以金山毒霸10為例,操作步驟如下:
1、打開金山毒霸10,點擊更多按鈕;
2、右上角搜索框輸入網(wǎng)絡(luò)測速,點擊搜索結(jié)果;
3、自動開始測試下載和上傳帶寬,等待測試結(jié)束即可。
概述在網(wǎng)絡(luò)編程中,有時我們需要判斷兩臺機器之間的連通性,或者說是一臺機器到另一臺機器的網(wǎng)絡(luò)可達性。在系統(tǒng)層面的測試中,我們常常用 Ping 命令來做驗證。盡管 Java 提供了比較豐富的網(wǎng)絡(luò)編程類庫(包括在應(yīng)用層的基于 URL 的網(wǎng)絡(luò)資源讀取,基于 TCP/IP 層的 Socket 編程,以及一些輔助的類庫),但是沒有直接提供類似 Ping 命令來測試網(wǎng)絡(luò)連通性的方法。本文將介紹如何通過 Java 已有的 API,編程實現(xiàn)各種場景下兩臺機器之間的網(wǎng)絡(luò)可達性判斷。在下面的章節(jié)中,我們會使用 Java 網(wǎng)絡(luò)編程的一些類庫 java.net.InetAddress 和 java.net.Socket,通過例子解釋如何模擬 Ping 命令。回頁首簡單判斷兩臺機器的可達性一般情況下,我們僅僅需要判斷從一臺機器是否可以訪問(Ping)到另一臺機器,此時,可以簡單的使用 Java 類庫中 java.net.InetAddress 類來實現(xiàn),這個類提供了兩個方法探測遠程機器是否可達 ?0?2boolean isReachable(int?0?2timeout) //?0?2測試地址是否可達?0?2boolean isReachable(NetworkInterface?0?2netif, int?0?2ttl, int?0?2timeout) //?0?2測試地址是否可達. 簡單說來,上述方法就是通過遠端機器的 IP 地址構(gòu)造 InetAddress 對象,然后調(diào)用其 isReachable 方法,測試調(diào)用機器和遠端機器的網(wǎng)絡(luò)可達性。注意到遠端機器可能有多個 IP 地址,因而可能要迭代的測試所有的情況。清單1:簡單判斷兩臺機器的可達性 void isAddressAvailable(String ip){ try{ InetAddress address = InetAddress.getByName(ip);//ping this IP if(address instanceof java.net.Inet4Address){ System.out.println(ip + " is ipv4 address"); }else if(address instanceof java.net.Inet6Address){ System.out.println(ip + " is ipv6 address"); }else{ System.out.println(ip + " is unrecongized"); } if(address.isReachable(5000)){ System.out.println("SUCCESS - ping " + IP + " with no interface specified"); }else{ System.out.println("FAILURE - ping " + IP + " with no interface specified"); } System.out.println("
-------Trying different interfaces--------
"); EnumerationNetworkInterface netInterfaces = NetworkInterface.getNetworkInterfaces(); while(netInterfaces.hasMoreElements()) { NetworkInterface ni = netInterfaces.nextElement(); System.out.println( "Checking interface, DisplayName:" + ni.getDisplayName() + ", Name:" + ni.getName()); if(address.isReachable(ni, 0, 5000)){ System.out.println("SUCCESS - ping " + ip); }else{ System.out.println("FAILURE - ping " + ip); } EnumerationInetAddress ips = ni.getInetAddresses(); while(ips.hasMoreElements()) { System.out.println("IP: " + ips.nextElement().getHostAddress()); } System.out.println("-------------------------------------------"); } }catch(Exception e){ System.out.println("error occurs."); e.printStackTrace(); } } 程序輸出 --------------START-------------- 10.13.20.70 is ipv4 address SUCCESS - ping 10.13.20.70 with no interface specified -------Trying different interfaces-------- Checking interface, DisplayName:MS TCP Loopback interface, Name:lo FAILURE - ping 10.13.20.70 IP: 127.0.0.1 ------------------------------------------- Checking interface, DisplayName:Intel(R) Centrino(R) Advanced-N 6200 AGN - Teefer2 Miniport, Name:eth0 FAILURE - ping 10.13.20.70 IP: 9.123.231.40 ------------------------------------------- Checking interface, DisplayName:Intel(R) 82577LM Gigabit Network Connection - Teefer2 Miniport, Name:eth1 SUCCESS - ping 10.13.20.70 ------------------------------------------- Checking interface, DisplayName:WAN (PPP/SLIP) Interface, Name:ppp0 SUCCESS - ping 10.13.20.70 IP: 10.0.50.189 ------------------------------------------- --------------END-------------- 從上可以看出 isReachable 的用法,可以不指定任何接口來判斷遠端網(wǎng)絡(luò)的可達性,但這不能區(qū)分出數(shù)據(jù)包是從那個網(wǎng)絡(luò)接口發(fā)出去的 ( 如果本地有多個網(wǎng)絡(luò)接口的話 );而高級版本的 isReachable 則可以指定從本地的哪個網(wǎng)絡(luò)接口測試,這樣可以準確的知道遠端網(wǎng)絡(luò)可以連通本地的哪個網(wǎng)絡(luò)接口。但是,Java 本身沒有提供任何方法來判斷本地的哪個 IP 地址可以連通遠端網(wǎng)絡(luò),Java 網(wǎng)絡(luò)編程接口也沒有提供方法來訪問 ICMP 協(xié)議數(shù)據(jù)包,因而通過 ICMP 的網(wǎng)絡(luò)不可達數(shù)據(jù)包實現(xiàn)這一點也是不可能的 ( 當然可以用 JNI 來實現(xiàn),但就和系統(tǒng)平臺相關(guān)了 ), 此時可以考慮本文下一節(jié)提出的方法?;仨撌字付ū镜睾瓦h程網(wǎng)絡(luò)地址,判斷兩臺機器之間的可達性在某些情況下,我們可能要確定本地的哪個網(wǎng)絡(luò)地址可以連通遠程網(wǎng)絡(luò),以便遠程網(wǎng)絡(luò)可以回連到本地使用某些服務(wù)或發(fā)出某些通知。一個典型的應(yīng)用場景是,本地啟動了文件傳輸服務(wù) ( 如 FTP),需要將本地的某個 IP 地址發(fā)送到遠端機器,以便遠端機器可以通過該地址下載文件;或者遠端機器提供某些服務(wù),在某些事件發(fā)生時通知注冊了獲取這些事件的機器 ( 常見于系統(tǒng)管理領(lǐng)域 ),因而在注冊時需要提供本地的某個可達 ( 從遠端 ) 地址。雖然我們可以用 InetAddress.isReachabl 方法判斷出本地的哪個網(wǎng)絡(luò)接口可連通遠程玩過,但是由于單個網(wǎng)絡(luò)接口是可以配置多個 IP 地址的,因而在此并不合適。我們可以使用 Socket 建立可能的 TCP 連接,進而判斷某個本地 IP 地址是否可達遠程網(wǎng)絡(luò)。我們使用 java.net.Socket 類中的 connect 方法 void connect(SocketAddress?0?2endpoint, int?0?2timeout) ?0?2//使用Socket連接服務(wù)器,指定超時的時間 這種方法需要遠程的某個端口,該端口可以是任何基于 TCP 協(xié)議的開放服務(wù)的端口(如一般都會開放的 ECHO 服務(wù)端口 7, Linux 的 SSH 服務(wù)端口 22 等)。實際上,建立的 TCP 連接被協(xié)議棧放置在連接隊列,進而分發(fā)到真正處理數(shù)據(jù)的各個應(yīng)用服務(wù),由于 UDP 沒有連接的過程,因而基于 UDP 的服務(wù)(如 SNMP)無法在此方法中應(yīng)用。具體過程是,枚舉本地的每個網(wǎng)絡(luò)地址,建立本地 Socket,在某個端口上嘗試連接遠程地址,如果可以連接上,則說明該本地地址可達遠程網(wǎng)絡(luò)。程序清單 2:指定本地地址和遠程地址,判斷兩臺機器之間的可達性 void printReachableIP(InetAddress remoteAddr, int port){ String retIP = null; EnumerationNetworkInterface netInterfaces; try{ netInterfaces = NetworkInterface.getNetworkInterfaces(); while(netInterfaces.hasMoreElements()) { NetworkInterface ni = netInterfaces.nextElement(); EnumerationInetAddress localAddrs = ni.getInetAddresses(); while(localAddrs.hasMoreElements()){ InetAddress localAddr = localAddrs.nextElement(); if(isReachable(localAddr, remoteAddr, port, 5000)){ retIP = localAddr.getHostAddress(); break; } } } } catch(SocketException e) { System.out.println( "Error occurred while listing all the local network addresses."); } if(retIP == null){ System.out.println("NULL reachable local IP is found!"); }else{ System.out.println("Reachable local IP is found, it is " + retIP); } } boolean isReachable(InetAddress localInetAddr, InetAddress remoteInetAddr, int port, int timeout) { booleanisReachable = false; Socket socket = null; try{ socket = newSocket(); // 端口號設(shè)置為 0 表示在本地挑選一個可用端口進行連接 SocketAddress localSocketAddr = new InetSocketAddress(localInetAddr, 0); socket.bind(localSocketAddr); InetSocketAddress endpointSocketAddr = new InetSocketAddress(remoteInetAddr, port); socket.connect(endpointSocketAddr, timeout); System.out.println("SUCCESS - connection established! Local: " + localInetAddr.getHostAddress() + " remote: " + remoteInetAddr.getHostAddress() + " port" + port); isReachable = true; } catch(IOException e) { System.out.println("FAILRE - CAN not connect! Local: " + localInetAddr.getHostAddress() + " remote: " + remoteInetAddr.getHostAddress() + " port" + port); } finally{ if(socket != null) { try{ socket.close(); } catch(IOException e) { System.out.println("Error occurred while closing socket.."); } } } return isReachable; } 運行結(jié)果 --------------START-------------- FAILRE - CAN not connect! Local: 127.0.0.1 remote: 10.8.1.50 port22 FAILRE - CAN not connect! Local: 9.123.231.40 remote: 10.8.1.50 port22 SUCCESS - connection established! Local: 10.0.50.189 remote: 10.8.1.50 port22 Reachable local IP is found, it is 10.0.50.189 --------------END-------------- 回頁首IPv4 和 IPv6 混合網(wǎng)絡(luò)下編程當網(wǎng)絡(luò)環(huán)境中存在 IPv4 和 IPv6,即機器既有 IPv4 地址,又有 IPv6 地址的時候,我們可以對程序進行一些優(yōu)化,比如 由于IPv4 和 IPv6 地址之間是無法互相訪問的,因此僅需要判斷 IPv4 地址之間和 IPv6 地址之間的可達性。 對于IPv4 的換回地址可以不做判斷,對于 IPv6 的 Linklocal 地址也可以跳過測試 根據(jù)實際的需要,我們可以優(yōu)先考慮選擇使用 IPv4 或者 IPv6,提高判斷的效率程序清單 3: 判斷本地地址和遠程地址是否同為 IPv4 或者 IPv6 // 判斷是 IPv4 還是 IPv6 if(!((localInetAddr instanceofInet4Address) (remoteInetAddr instanceofInet4Address) || (localInetAddr instanceofInet6Address) (remoteInetAddr instanceofInet6Address))){ // 本地和遠程不是同時是 IPv4 或者 IPv6,跳過這種情況,不作檢測 break; } 程序清單 4:跳過本地地址和 LinkLocal 地址 if( localAddr.isLoopbackAddress() || localAddr.isAnyLocalAddress() || localAddr.isLinkLocalAddress() ){ // 地址為本地環(huán)回地址,跳過 break; } 回頁首總結(jié)和展望本文列舉集中典型的場景,介紹了通過 Java 網(wǎng)絡(luò)編程接口判斷機器之間可達性的幾種方式。在實際應(yīng)用中,可以根據(jù)不同的需要選擇相應(yīng)的方法稍加修改即可。對于更加特殊的需求,還可以考慮通過 JNI 的方法直接調(diào)用系統(tǒng) API 來實現(xiàn),能提供更加強大和靈活的功能,這里就不再贅述了。參考資料 學習 參考developerWorks 的文章 Java 應(yīng)用程序的網(wǎng)絡(luò)運行環(huán)境編程,獲取更多網(wǎng)絡(luò)編程相關(guān)的信息。
如果要通過 JNI 進行網(wǎng)絡(luò)編程,可以參考 developerWorks 上的文章 用JNI 進行 Java 編程,了解更多 JNI 相關(guān)的信息和例子。
參考Javadoc 獲取更多關(guān)于 Java 網(wǎng)絡(luò)編程的 API 的信息。
developerWorks Java 技術(shù)專區(qū):這里有數(shù)百篇關(guān)于 Java 編程各個方面的文章。
討論加入developerWorks 中文社區(qū)。查看開發(fā)人員推動的博客、論壇、組和維基,并與其他 developerWorks 用戶交流。
作者簡介吳校軍,IBM CSTL 軟件工程師,長期從事 IBM 系統(tǒng)管理相關(guān)軟件的開發(fā),目前負責 Director6.1 Update Manager 的開發(fā)。劉冠群現(xiàn)為 IBM 上海系統(tǒng)科技開發(fā)中心(CSTL)的軟件工程師,有多年的 Java 和 C++ 編程經(jīng)驗,對于操作系統(tǒng),網(wǎng)絡(luò)和編程語言的內(nèi)部實現(xiàn)有強烈興趣。關(guān)閉[x]關(guān)于報告濫用的幫助報告濫用謝謝! 此內(nèi)容已經(jīng)標識給管理員注意。關(guān)閉[x]關(guān)于報告濫用的幫助報告濫用報告濫用提交失敗。 請稍后重試。關(guān)閉[x]developerWorks:登錄IBM ID:需要一個 IBM ID?忘記IBM ID?密碼:忘記密碼?更改您的密碼 保持登錄。單擊提交則表示您同意developerWorks 的條款和條件。 使用條款 當您初次登錄到 developerWorks 時,將會為您創(chuàng)建一份概要信息。您在developerWorks 概要信息中選擇公開的信息將公開顯示給其他人,但您可以隨時修改這些信息的顯示狀態(tài)。您的姓名(除非選擇隱藏)和昵稱將和您在 developerWorks 發(fā)布的內(nèi)容一同顯示。所有提交的信息確保安全。關(guān)閉[x]請選擇您的昵稱:當您初次登錄到 developerWorks 時,將會為您創(chuàng)建一份概要信息,您需要指定一個昵稱。您的昵稱將和您在 developerWorks 發(fā)布的內(nèi)容顯示在一起。昵稱長度在 3 至 31 個字符之間。 您的昵稱在 developerWorks 社區(qū)中必須是唯一的,并且出于隱私保護的原因,不能是您的電子郵件地址。昵稱:(長度在 3 至 31 個字符之間)單擊提交則表示您同意developerWorks 的條款和條件。 使用條款. 所有提交的信息確保安全。
你可以在JSP頁面用這三個方法
request.getRemoteAddr()//獲取遠程IP
request.getRemoteUser()//獲取遠程用戶
request.getRemoteHost()//獲取遠程主機
可以寫方法,請看java.net包下的類.
java.net.InetAddress
java.net.InetSocketAddress
獲取IP,主機和端口.
網(wǎng)頁標題:java網(wǎng)絡(luò)帶寬檢測代碼,測試網(wǎng)絡(luò)的代碼
文章網(wǎng)址:http://aaarwkj.com/article38/dsspipp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、ChatGPT、商城網(wǎng)站、網(wǎng)頁設(shè)計公司、品牌網(wǎng)站設(shè)計、虛擬主機
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)