2013-05-12 82 views
2

我正在做某種客戶端 - 服務器連接。客戶端可以連接到多個服務器,因此需要知道該服務器是否在線。我不想先輸入所有的登錄信息,而是希望JLabel能夠顯示服務器是否在線。我如何檢查這一點,而不與服務器建立真正的連接?如何檢查服務器是否在線?

+0

什麼樣的客戶端 - 服務器連接?它是否可以代理(如HTTP)? – 2013-05-12 18:39:19

+0

我不太瞭解網絡,但它是使用套接字的連接。 – Creator13 2013-05-12 18:53:56

+1

然後,沒有冒犯,但你正確完成這項工作的機率是相當低的。 – 2013-05-12 19:08:40

回答

6

,最好的辦法是讓服務器真正的連接,並要求它,如果它是在線,使用盡可能接近實際使用的方法服務器。其他方法創建獨立的失敗模式和不同的方法,必須單獨維護,一個可能會失敗,另一個可能會失敗。

想想像代理和防火牆的東西。爲什麼要讓自己和每個需要使用系統的人都感到困難?除非你沒有告訴我們有什麼不尋常的事情,否則沒有必要創建一個完全不同的訪問方法來測試可用性。

+0

由於客戶端使用服務器端語句'ServerSocket.accept()'的服務器,並且它在連接上創建了一個新的線程,所以我不希望發生這種情況,只是爲了測試連接。 一般來說,因爲這是從Minecraft Bukkit服務器運行的,所以我想可能有客戶端連接。 – Creator13 2013-05-12 18:58:34

+0

然後當服務器不在線時(例如,如果進程沒有運行),並且被告知多次不在線時(例如,如果在代理服務器或防火牆後面),服務器會多次聯機阻止ICMP回聲)。 – 2013-05-12 19:09:27

0

我不知道是否可以使用java ping服務器。但是您可以嘗試在您的Main的構造函數中ping服務器的ip,並且如果它返回回顯,請使標籤更改其值。

0

使用InetAddress.isReachable

注意,這將檢查服務器是否可達,不是是否與特定URL /服務。爲此,你最好做一個測試請求。

1

嘗試這樣的事情來ping它:

InetAddress address = InetAddress.getByName("address"); 

    if (address.isReachable(3000)) 
     label.setName("online") 
+3

這是一個危險的建議。首先,你不知道他的客戶機 - 服務器協議是否可以被委託。如果是這樣,客戶端在代理服務器後面將會失敗。如果服務器位於不傳遞ping命令的防火牆之後(或者服務器本身不回覆它),它也會失敗。 – 2013-05-12 18:39:51

+0

這也是一個不正確的建議。如果主機啓動並且服務關閉,它將返回誤報。 – EJP 2013-05-13 01:53:41

0

只需連接。

發現任何資源是否可用的最佳方法是嘗試使用它。這適用於網絡連接,文件,任何你喜歡的。編寫其他內容如isReachable(),exists(),isWritable()等的輔助測試時,最好重複使用該資源時系統將要執行的操作,最壞的情況下執行不同的操作,以產生不同的結果。

在任何一種情況下,您都會介紹一個時間窗口,在此期間可用性可能會在任一方向發生變化。

相關問題