導航:首頁 > 編程大全 > java檢測網路狀態

java檢測網路狀態

發布時間:2023-01-20 15:11:41

java中判斷網路通不通返回500是什麼意思

內部伺服器錯誤

⑵ 使用Java 測試網路連通性的幾種方法

概述在網路編程中,有時我們需要判斷兩台機器之間的連通性,或者說是一台機器到另一台機器的網路可達性。在系統層面的測試中,我們常常用 Ping 命令來做驗證。盡管 Java 提供了比較豐富的網路編程類庫(包括在應用層的基於 URL 的網路資源讀取,基於 TCP/IP 層的 Socket 編程,以及一些輔助的類庫),但是沒有直接提供類似 Ping 命令來測試網路連通性的方法。本文將介紹如何通過 Java 已有的 API,編程實現各種場景下兩台機器之間的網路可達性判斷。在下面的章節中,我們會使用 Java 網路編程的一些類庫 java.net.InetAddress 和 java.net.Socket,通過例子解釋如何模擬 Ping 命令。回頁首簡單判斷兩台機器的可達性一般情況下,我們僅僅需要判斷從一台機器是否可以訪問(Ping)到另一台機器,此時,可以簡單的使用 Java 類庫中 java.net.InetAddress 類來實現,這個類提供了兩個方法探測遠程機器是否可達 �0�2boolean isReachable(int�0�2timeout) //�0�2測試地址是否可達�0�2boolean isReachable(NetworkInterface�0�2netif, int�0�2ttl, int�0�2timeout) //�0�2測試地址是否可達. 簡單說來,上述方法就是通過遠端機器的 IP 地址構造 InetAddress 對象,然後調用其 isReachable 方法,測試調用機器和遠端機器的網路可達性。注意到遠端機器可能有多個 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("\n-------Trying different interfaces--------\n"); Enumeration<NetworkInterface> 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); } Enumeration<InetAddress> 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 的用法,可以不指定任何介面來判斷遠端網路的可達性,但這不能區分出數據包是從那個網路介面發出去的 ( 如果本地有多個網路介面的話 );而高級版本的 isReachable 則可以指定從本地的哪個網路介面測試,這樣可以准確的知道遠端網路可以連通本地的哪個網路介面。但是,Java 本身沒有提供任何方法來判斷本地的哪個 IP 地址可以連通遠端網路,Java 網路編程介面也沒有提供方法來訪問 ICMP 協議數據包,因而通過 ICMP 的網路不可達數據包實現這一點也是不可能的 ( 當然可以用 JNI 來實現,但就和系統平台相關了 ), 此時可以考慮本文下一節提出的方法。回頁首指定本地和遠程網路地址,判斷兩台機器之間的可達性在某些情況下,我們可能要確定本地的哪個網路地址可以連通遠程網路,以便遠程網路可以回連到本地使用某些服務或發出某些通知。一個典型的應用場景是,本地啟動了文件傳輸服務 ( 如 FTP),需要將本地的某個 IP 地址發送到遠端機器,以便遠端機器可以通過該地址下載文件;或者遠端機器提供某些服務,在某些事件發生時通知注冊了獲取這些事件的機器 ( 常見於系統管理領域 ),因而在注冊時需要提供本地的某個可達 ( 從遠端 ) 地址。雖然我們可以用 InetAddress.isReachabl 方法判斷出本地的哪個網路介面可連通遠程玩過,但是由於單個網路介面是可以配置多個 IP 地址的,因而在此並不合適。我們可以使用 Socket 建立可能的 TCP 連接,進而判斷某個本地 IP 地址是否可達遠程網路。我們使用 java.net.Socket 類中的 connect 方法 void connect(SocketAddress�0�2endpoint, int�0�2timeout) �0�2//使用Socket連接伺服器,指定超時的時間 這種方法需要遠程的某個埠,該埠可以是任何基於 TCP 協議的開放服務的埠(如一般都會開放的 ECHO 服務埠 7, Linux 的 SSH 服務埠 22 等)。實際上,建立的 TCP 連接被協議棧放置在連接隊列,進而分發到真正處理數據的各個應用服務,由於 UDP 沒有連接的過程,因而基於 UDP 的服務(如 SNMP)無法在此方法中應用。具體過程是,枚舉本地的每個網路地址,建立本地 Socket,在某個埠上嘗試連接遠程地址,如果可以連接上,則說明該本地地址可達遠程網路。程序清單 2:指定本地地址和遠程地址,判斷兩台機器之間的可達性 void printReachableIP(InetAddress remoteAddr, int port){ String retIP = null; Enumeration<NetworkInterface> netInterfaces; try{ netInterfaces = NetworkInterface.getNetworkInterfaces(); while(netInterfaces.hasMoreElements()) { NetworkInterface ni = netInterfaces.nextElement(); Enumeration<InetAddress> 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(); // 埠號設置為 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; } 運行結果 --------------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 混合網路下編程當網路環境中存在 IPv4 和 IPv6,即機器既有 IPv4 地址,又有 IPv6 地址的時候,我們可以對程序進行一些優化,比如 由於IPv4 和 IPv6 地址之間是無法互相訪問的,因此僅需要判斷 IPv4 地址之間和 IPv6 地址之間的可達性。 對於IPv4 的換回地址可以不做判斷,對於 IPv6 的 Linklocal 地址也可以跳過測試 根據實際的需要,我們可以優先考慮選擇使用 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() ){ // 地址為本地環回地址,跳過 break; } 回頁首總結和展望本文列舉集中典型的場景,介紹了通過 Java 網路編程介面判斷機器之間可達性的幾種方式。在實際應用中,可以根據不同的需要選擇相應的方法稍加修改即可。對於更加特殊的需求,還可以考慮通過 JNI 的方法直接調用系統 API 來實現,能提供更加強大和靈活的功能,這里就不再贅述了。參考資料 學習 參考developerWorks 的文章 Java 應用程序的網路運行環境編程,獲取更多網路編程相關的信息。 如果要通過 JNI 進行網路編程,可以參考 developerWorks 上的文章 用JNI 進行 Java 編程,了解更多 JNI 相關的信息和例子。 參考Javadoc 獲取更多關於 Java 網路編程的 API 的信息。 developerWorks Java 技術專區:這里有數百篇關於 Java 編程各個方面的文章。 討論加入developerWorks 中文社區。查看開發人員推動的博客、論壇、組和維基,並與其他 developerWorks 用戶交流。 作者簡介吳校軍,IBM CSTL 軟體工程師,長期從事 IBM 系統管理相關軟體的開發,目前負責 Director6.1 Update Manager 的開發。劉冠群現為 IBM 上海系統科技開發中心(CSTL)的軟體工程師,有多年的 Java 和 C++ 編程經驗,對於操作系統,網路和編程語言的內部實現有強烈興趣。關閉[x]關於報告濫用的幫助報告濫用謝謝! 此內容已經標識給管理員注意。關閉[x]關於報告濫用的幫助報告濫用報告濫用提交失敗。 請稍後重試。關閉[x]developerWorks:登錄IBM ID:需要一個 IBM ID?忘記IBM ID?密碼:忘記密碼?更改您的密碼 保持登錄。單擊提交則表示您同意developerWorks 的條款和條件。 使用條款 當您初次登錄到 developerWorks 時,將會為您創建一份概要信息。您在developerWorks 概要信息中選擇公開的信息將公開顯示給其他人,但您可以隨時修改這些信息的顯示狀態。您的姓名(除非選擇隱藏)和昵稱將和您在 developerWorks 發布的內容一同顯示。所有提交的信息確保安全。關閉[x]請選擇您的昵稱:當您初次登錄到 developerWorks 時,將會為您創建一份概要信息,您需要指定一個昵稱。您的昵稱將和您在 developerWorks 發布的內容顯示在一起。昵稱長度在 3 至 31 個字元之間。 您的昵稱在 developerWorks 社區中必須是唯一的,並且出於隱私保護的原因,不能是您的電子郵件地址。昵稱:(長度在 3 至 31 個字元之間)單擊提交則表示您同意developerWorks 的條款和條件。 使用條款. 所有提交的信息確保安全。為本文評分評論回頁首

⑶ 求java代碼:檢查伺服器是否掛掉的,例如檢查伺服器「123.54.1.56」是否掛

/**
*@authorHuHui
*@功能:持續檢測網路是否連通
*/
packagecom.hh.net;

importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.File;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.text.SimpleDateFormat;
importjava.util.Date;

{

publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
NetworkStatens=newNetworkState();
newThread(ns).start();//啟動線程
}

//判斷網路狀態
publicvoidisConnect(){
Runtimeruntime=Runtime.getRuntime();
try{
Processprocess=runtime.exec("ping"+"www.google.ca");
InputStreamis=process.getInputStream();
InputStreamReaderisr=newInputStreamReader(is);
BufferedReaderbr=newBufferedReader(isr);
Stringline=null;
StringBuffersb=newStringBuffer();
while((line=br.readLine())!=null){
sb.append(line);
//System.out.println("返回值為:"+line);
}
is.close();
isr.close();
br.close();

if(null!=sb&&!sb.toString().equals("")){
StringlogString="";
if(sb.toString().indexOf("TTL")>0){
//網路暢通
logString="網路正常,時間"+this.getCurrentTime();
// System.out.println(logString);
}else{
//網路不暢通
logString="網路斷開,時間"+this.getCurrentTime();
// System.out.println(logString);
}
this.writeIntoLog(logString);
}
}catch(Exceptione){
e.printStackTrace();
}
}

//獲得當前時間
publicStringgetCurrentTime(){
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");
Stringtime=sdf.format(newDate());
returntime;
}

//將信息寫入日誌文件
publicvoidwriteIntoLog(StringlogString){
Filefile=null;
FileWriterfw=null;
BufferedWriterbw=null;
try{
file=newFile("C:\netWorkState.log");
if(!file.exists()){
file.createNewFile();//如果不存在該文件,則創建
Stringsets="attrib+H""+file.getAbsolutePath()+""";
Runtime.getRuntime().exec(sets);//將日誌文件隱藏
}
fw=newFileWriter(file,true);
bw=newBufferedWriter(fw);
fw.append(logString+" ");//換行
}catch(Exceptione){
//TODO:handleexception
e.printStackTrace();
}finally{
try{
bw.close();
fw.close();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}

}

@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
while(true){
this.isConnect();
try{
//每隔3秒鍾測試一次網路是否連通
Thread.sleep(3000);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}

}

⑷ JavaWeb開發網站,監測用戶在線狀態

用ajax吧。

網頁裡面加點javascript代碼,在後台每120秒和伺服器端通信一次。失敗的話,表示客戶端退出了

不過這樣,伺服器並發壓力很大。

⑸ java mina 數據發送前怎樣判斷連接狀態

1 Mina基本開發知識
1.1 非阻塞模式

JavaNIO非堵塞應用通常適用用在I/O讀寫等方面,我們知道,系統運行的性能瓶頸通常在I/O讀寫,包括對埠和文件的操作上,過去,在打開一個I/O通道後,read()將一直等待在埠一邊讀取位元組內容,如果沒有內容進來,read()也是傻傻的等,這會影響我們程序繼續做其他事情,那麼改進做法就是開設線程,讓線程去等待,但是這樣做也是相當耗費資源(傳統socket通訊伺服器設計模式)的。
Java NIO非堵塞技術實際是採取Reactor模式,或者說是Observer模式為我們監察I/O埠,如果有內容進來,會自動通知我們,這樣,我們就不必開啟多個線程死等,從外界看,實現了流暢的I/O讀寫,不堵塞了。
Java NIO出現不只是一個技術性能的提高,你會發現網路上到處在介紹它,因為它具有里程碑意義,從JDK1.4開始,Java開始提高性能相關的功能,從而使得Java在底層或者並行分布式計算等操作上已經可以和C或Perl等語言並駕齊驅。
如果你至今還是在懷疑Java的性能,說明你的思想和觀念已經完全落伍了,Java一兩年就應該用新的名詞來定義。從JDK1.5開始又要提供關於線程、並發等新性能的支持,Java應用在游戲等適時領域方面的機會已經成熟,Java在穩定自己中間件地位後,開始蠶食傳統C的領域。
NIO 有一個主要的類Selector,這個類似一個觀察者,只要我們把需要探知的socketchannel告訴Selector,我們接著做別的事情,當有事件發生時,他會通知我們,傳回一組SelectionKey,我們讀取這些Key,就會獲得我們剛剛注冊過的socketchannel,然後,我們從這個Channel中讀取數據,放心,包準能夠讀到,接著我們可以處理這些數據。Selector內部原理實際是在做一個對所注冊的channel的輪詢訪問,不斷的輪詢(目前就這一個演算法),一旦輪詢到一個channel有所注冊的事情發生,比如數據來了,他就會站起來報告,交出一把鑰匙,讓我們通過這把鑰匙(SelectionKey表示 SelectableChannel 在 Selector 中的注冊的標記。 )來讀取這個channel的內容.

1.2 什麼是mian
現在已經是World Wide Web的時代,無數的web應用框架被創造出來從而大大的提高了web開發的速度。拋開WWW的這個優勢,我們知道還有很多協議是HTTP協議所無法替代的。有時,我們仍然需要構造c/s應用來實現適當的協議。
你有沒有曾經使用java或者其他語言實現過某個協議棧?就像你所經歷過的那樣,編寫網路應用即使對於有經驗的開發者也不是容易的事情。這歸咎於以下幾個方面:
* 沒有為開發者設計的合適的網路應用框架.
* 使你無法在有限的時間內創建你的應用.
* 網路I/O編碼,消息的編/解碼,業務邏輯常常糾纏在一起.
* 使程序失去可維護性和可復用性
* 網路應用難於進行單元測試
* 你失去了敏捷性
MINA是一個網路應用框架,在不犧牲性能和可擴展性的前提下用於解決上面的所有問題。
1.3 幾個介面
IoAcceptor執行所有底層IO,將他們翻譯成抽象的IO事件,並把翻譯

⑹ 如何檢測區域網內 網路穩定狀態! java.net.ConnectException: Connection timed out: connect

ping 24小時沒有捕捉到丟包情況!說明網路正常啊沒有丟失狀況 這問題很棘手 我也還不清楚

⑺ 電腦含有多個網卡,如何在java程序中判斷哪個網卡正在使用,當由有線連接上網改變為無線時又該怎麼判斷。

依次雙擊打開兩個連接圖標,同時查看連接狀態中的數據變化,再打開一個網頁瀏覽,一般發送和接收兩個數據都反映強烈的,表明該網路信息流量就大,反映大的應該是正在運行中的網路。試試看哦。
qq494202907

⑻ java中有和獲取wifi信息的函數嗎

java中是沒有的,wifi是需要有硬體設備去支持,不過android中有提供相應的api,也是java寫的噢
在Android中對Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面。主要包括以下幾個類和介面:
1.ScanResult
主要用來描述已經檢測出的接入點,包括接入點的地址,接入點的名稱,身份認證,頻率,信號強度等信息。
2.WifiConfiguration
Wifi網路的配置,包括安全設置等。
3.WifiInfo
wifi無線連接的描述,包括接入點,網路連接狀態,隱藏的接入點,IP地址,連接速度,MAC地址,網路ID,信號強度等信息。這里簡單介紹一下這里的方法:
getBSSID() 獲取BSSID
getDetailedStateOf() 獲取客戶端的連通性
getHiddenSSID() 獲得SSID 是否被隱藏
getIpAddress() 獲取IP 地址
getLinkSpeed() 獲得連接的速度
getMacAddress() 獲得Mac 地址
getRssi() 獲得802.11n 網路的信號
getSSID() 獲得SSID
getSupplicanState() 返回具體客戶端狀態的信息
4.WifiManager
這個不用說,就是用來管理我們的wifi 連接,這里已經定義好了一些類,可以供我們使用。
獲取WIFI網卡的狀態
WIFI網卡的狀態是由一系列的整形常量來表示的。
1.WIFI_STATE_DISABLED : WIFI網卡不可用(1)
2.WIFI_STATE_DISABLING : WIFI網卡正在關閉(0)
3.WIFI_STATE_ENABLED : WIFI網卡可用(3)
4.WIFI_STATE_ENABLING : WIFI網正在打開(2) (WIFI啟動需要一段時間)

5.WIFI_STATE_UNKNOWN : 未知網卡狀態

⑼ Carson帶你學Android:檢測網路狀態&監聽網路變化

由於在API23及以上時,getNetworkInfo(int networkType)方法已被棄用,取而代之的是:

所以檢測網路狀態時需要分版本進行檢測

使用BroadcastReceiver廣播接收器來接收網路狀態(採用系統廣播)

接下來我將用一個實例進行網路狀態的監聽和檢測。

NetWorkStateReceiver.java

注冊分為:動態注冊和靜態注冊

MainActivity.java

在AndroidManifest.xml進行廣播的靜態注冊
AndroidManifest.xml

AndroidManifest.xml

Carson的Github地址: Check_Net

不定期分享關於 安卓開發 的干貨,追求 短、平、快 ,但 卻不缺深度

⑽ java如何實現監控伺服器網路流量

前兩本地代碼在用戶層都幹不了,後一個沒什麼特殊情況直接執行shell命令就是了

閱讀全文

與java檢測網路狀態相關的資料

熱點內容
excel2010表格工具在哪 瀏覽:935
路由器一個賬號密碼忘了怎麼辦 瀏覽:83
根據內容檢索文件 瀏覽:569
索尼手機文件夾 瀏覽:739
win1010194190 瀏覽:722
windows文件夾命名 瀏覽:905
博易大師升級文件在哪裡 瀏覽:415
ghost83手動安裝教程 瀏覽:802
谷歌代碼編寫規范 瀏覽:938
pdf掃描文件歪斜怎樣處理 瀏覽:752
電教室網路如何破解 瀏覽:939
jsfunctionthis 瀏覽:16
蕪湖寒假編程培訓是什麼 瀏覽:609
api源碼分享網站 瀏覽:511
小米復制文件找不到 瀏覽:959
什麼是網路層 瀏覽:73
如何利用編程做多文件數據合並 瀏覽:666
java如何用tcp發送16進制協議 瀏覽:975
js獲取當天 瀏覽:637
在什麼網站看戰狼2 瀏覽:881

友情鏈接