2009-07-21 173 views
1

我正在寫一個java應用程序,我需要快速發現任何有線或無線本地網絡上的其他正在運行的客戶端,以建立TCP連接。在WiFi網絡上發現客戶端

這樣做的最好方法是什麼?是否有庫或代碼片段會這樣做?

+0

作爲一個旁註,我可能會使用tcp連接到客戶端,但我並不意味着我需要使用tcp來查找客戶端 我還預計最終目標機器將處於通常的192.168.1.1類型主頁網絡,但我不會奢望假設這將成爲我的網絡,因此設置預定義的聯繫人服務器不是一種選擇 – 2009-07-21 13:42:33

回答

0

我想你需要在你的子網上的所有IP上掃描應用程序的端口。

什麼是可用的IP - 或者你的子網是什麼?
由於網絡設計爲對您的應用程序透明,因此恐怕無法確定這可能是不可能的。

所以,我會用蠻力:選擇你的IP並改變最後一個字節。可能太多了,但可能還不夠。

或者您發送廣播(通常將針對x.x.x.255)並查看誰的答案。 見Datagram BroadcastingMulticasts。但我認爲這不再是TCP/IP。

+2

不。這是一個非常糟糕的方法。多播是要走的路:廣播對於新業務來說不被認爲是可以接受的。當然,它仍然是IP,但你說的TCP只是單播。請參閱mDNS或SSDP在網絡上執行服務發現。 – 2012-06-02 15:44:41

1

網絡掃描可能很長,在無線網絡上甚至更長。如果您需要通過Java快速訪問它們,則可以在網絡上實施「會議點」服務器。此服務器偵聽預定義的端口,客戶端在啓動時在服務器上註冊,服務器可根據請求分發有關客戶端的信息。

HTH。

8

多播UDP是一個很好的方法。它用於支持通過本地IP網絡(UPnP和ZeroConf)自動發現網絡設備的兩種技術。

組播UDP不是TCP,但它仍然基於IP,所以使用相同的尋址機制,即IP地址。通常將其與無線電廣播進行比較,即多播發送者只需發送1條消息(即,它就像廣播),但只有「調入」到多播信道的客戶端纔會接收到它。

你可以在谷歌或維基百科對這些作爲首發快速搜索,但基本思路如下:

  • 客戶端啓動時,它會發出多播UDP「你好」消息某些預先指定的多播地址和端口(例如UPnP使用239.255.255.250:1900)
  • 現有客戶端正在偵聽指定地址和端口上的傳入多播「hello」消息 - 當客戶端收到一個消息時,它會向發送者
  • 發送「hello」消息的客戶端從n上的每個現有客戶端接收響應etwork,現在知道

如果您正在尋找庫使用,UPnP的圖書館可往往是有點重量級和很多民間的一般不喜歡他們,每個客戶端的IP地址,所以ZeroConf的可能會更適合。我不知道這些東西的Java實現,但我相信你可以找到一些有點挖掘。

+0

非常好的答案。要在mDNS和SSDP之間進行選擇,就發送數據包數而言,mDNS實際上比SSDP更重;兩者都有類似的發現模式;操作系統通常有一個mDNS守護進程,您可以將其掛接到(Bonjour或Avahi),而對於SSDP,您更有可能不得不推出自己的應用(Windows上除外)。 – 2012-06-02 15:48:31

0

有一個JGroups工具包可靠的多播通信。它允許使用多播技術自動發現其他客戶端,如其他答案中所述。

它還提供了多播套接字之上的通信API。

它用於JBoss,Tomcat等多個項目,爲分佈式緩存提供基礎架構。查看更多here