2010-04-26 82 views
2

假設我運行了幾臺在本地網絡上提供基本請求的服務器(比如說一個家庭網絡,所有機器通常都有一個IP,形式爲K.K.K.x,其中x是可變的)。有沒有簡單的方法來發現所有這些服務器?我需要在運行特定Java服務器應用程序的網絡上查找每個IP。如何發現本地網絡上的Web服務器?

回答

2

讓您擁有一個C類網絡...只是嘗試打開1和254之間的每個IP地址的特定服務器應用程序的端口如果你想獲得幻想,你可以做一些檢查,以驗證該端口實際上是打開的,它可以滿足你對該應用程序的期望。

+0

我並不太熱衷於網絡。我可以運行1-254,但是如何以跨平臺的方式獲取IP地址的前3個字節?我的直覺說,有一些工具,如ipconfig/ifconfig,有適當的參數,將返回本地IPV4地址(這將給我我需要的字節),但我想知道是否有更多的java-ish方式。 – 2010-04-27 01:50:43

+0

杜。我只是搜索「獲取IP地址Java」。這應該很好。 – 2010-04-27 02:06:10

1

因爲不是每個Web服務器的80固定端口上偵聽,您需要掃描端口。在每個端口上打開(並關閉!)一個套接字,您可以使用java.net.Socket。如果成功,然後在有關IP /端口上的/上發起一個簡單的GET請求,則可以使用java.net.URLConnection。如果您收到有效的HTTP響應(不管狀態碼如何),那麼它是一個網絡服務器。您可以通過HTTP響應中的Server頭來確定服務器類型。但是,您需要考慮到服務器管理員可能會欺騙/刪除/更改默認響應標頭。

注意,一些防火牆可以識別端口掃描器的掃描圖案並阻止此。

0

我會scan IP range和測試插座連接到端口80,這樣的代碼:

try { 
     s = new Socket(addr,80); 
     System.out.println("Webserver found on IP:" + addr); 
     s.close(); 
    } 
catch (IOException ex) { 
     System.out.println("Webserver NOT found on IP:" + addr); 
    } 
+1

不要忘記's.close()'。 – jweyrich 2010-04-26 23:56:45

4

您是否正在尋找您的Java應用程序中的解決方案?如果您只是在尋找一次性解決方案,nmap應該可以工作。

如果你的本地網絡的形式爲192 * * *試試這個(我加了sudo的,因爲它必須以root身份運行)。

sudo nmap -vv -sS -O -n "192.168.1.1/24" 
+0

+1 - 快速且非常強大。 – 2010-04-26 23:06:55

+1

需要root用戶,因爲您提供的選項執行SYN掃描,這依賴於RAW套接字,並且只能由超級用戶創建。 – jweyrich 2010-04-26 23:07:21

1

有兩種基本的方法來實現這一點,並且都要求您向要檢查的每個主機發送/接收數據包。

  • 最簡單的方法是試圖建立TCP連接所需的端口,如你通常做。

  • 一個更復雜的和花式的方法,但在執行方面更快,正在發送一個SYN分組,並且等待一個響應分組。如果響應是SYN/ACK,則表示端口已打開(等待連接),否則不是。但是,Java沒有爲此提供必要的API(請參閱raw socket)。你必須找到一個庫/包裝器或使用C和JNI編寫一個庫。

更多的見解,第二個選項,閱讀this

+0

這樣做需要能夠推送原始數據包,通常A)不能從Java執行,B)不可取,因爲發送原始數據包需要額外的系統特權。如果人們沒有以管理員身份運行Windows,那麼惡意軟件感染的情況就會少得多。 – 2010-04-26 23:27:26

+0

@Devon是正確的,我正在更新我的答案,提到Java沒有必要的API。 Microsoft刪除了對XP-SP2上原始套接字創建的支持,但您仍然可以創建/發送以太網幀。 – jweyrich 2010-04-26 23:42:18