2010-06-08 58 views
4

我有一個Java應用程序在服務提供程序中註冊一個服務器組件,然後將服務名稱發送給客戶端。客戶端使用服務名稱從服務提供者處獲取服務器的地址。但是,服務器有幾個接口,客戶端只能訪問其中一個接口,所以服務必須使用正確的IP進行註冊。我們通過廣播發現了客戶端,因此我擁有客戶端IP和計算機網絡接口的枚舉。如何將IP與接口相匹配,不知道客戶端IP的網絡掩碼是什麼?Java:我如何獲得可以到達遠程IP的本地接口的IP?

自發地我想象把所有的地址都整合起來,用他們的網絡掩碼搗毀本地ips並尋找'最佳匹配',但我想知道是否有更好的方法?

(這是一個企業(TM)解決方案,使切割出的服務提供商是不是一種選擇,至少不會瓦特/ OA政治運動第一;))

回答

2

據我瞭解,服務提供商在多個不同的網絡上有接口。每個客戶端僅位於其中一個網絡上,因此只能與其中一個接口進行通信。該服務需要發現客戶端可以訪問哪些接口,以便它可以發送正確的地址。您(服務開發人員)無法控制部署該服務的網絡環境,因此無法使用DNS等網絡級解決方案。

在很多網絡設置中,路由是對稱的。也就是說,從主機A到主機B的路由與從主機B到主機A的路由相同。如果您知道這是您的服務部署到的所有環境中的情況,那麼您可以安全地假定用於連接到客戶端的地址可供客戶端訪問。例如,可以通過將DatagramSocket連接到客戶端,然後調用其getLocalAddress()方法來發現該地址。

如果路由是不對稱的,我知道無法確定某個特定的接口是否只能使用java.net API訪問客戶端。如果您控制客戶端實現,則可能會在廣播響應數據包中包含廣播源地址(應該是對其可見的服務器接口)。除此之外,您還沒有提供足夠的關於該場景的信息來提供具體的建議。例如,知道什麼協議用於廣播廣告和客戶端對其的響應將是有用的。

+0

底層操作系統應該照顧大多數低級套接字的東西。只需創建套接字並調用get本地地址方法即可。作爲最後的手段,通過枚舉本地地址,您可以創建套接字,將它們綁定到套接字上,然後查看是否可以連接到您的客戶端。但'Socket(clientIP,port).getLocalAddress()'應該可以工作。 – Allen 2010-06-29 17:51:42

+0

只要網絡上的路由是對稱的,就應該可以工作。如果不是用於向客戶端發送數據報的本地IP可能與客戶端有權訪問的IP不同。 – 2010-06-30 05:25:32

0

這取決於你如何去約這個。

樣碼很多?

InetAddress有一個「.getHostAddress()」方法,可能有用。

+0

目前我只是抓住NetworkInterface.getNetworkInterfaces,通過他們所有,看看他們所有的inetAddresses(是的,用getHostAddress),然後匹配前3個八位字節。但正如我所說,我不能假設255.255.255.0位掩碼(或任何其他),所以我正在尋找一個更強大的解決方案。對isReachable和getByAddress的組合排序會很好,但我在API中沒有找到類似的東西。 – 2010-06-08 07:13:06

+0

「isReachable和getByAddress的組合排序本來不錯,但我在API中沒有找到類似的東西。」 - 您已經擁有地址,InetAdress擁有一個方法isReachable(int timeout)(自1.5開始),但根據文檔「如果可以獲得特權,典型實現將使用ICMP ECHO REQUEST,否則它將嘗試建立TCP連接目標主機的端口7(Echo)「,這樣就需要在服務器上啓用。 – 2010-06-08 11:46:53

0

這通常使用DNS完成。該接口應該在DNS中列出,以便您可以通過名稱而不是地址servicehost.example.com而不是192.0.2.42來訪問它。

+0

的確如此。我不確定是否在此環境中設置了任何DNS服務器,並且服務提供商現在只採用直接IP(並且由另一個國家的部門擁有)。但如果我可以使用DNS,我仍然需要爲每個地址註冊一個單獨的名稱嗎?我需要知道哪個名字可以從給定的IP訪問,而且我會處於或多或少相同的情況。或者DNS服務器處理這本質? – 2010-06-08 07:38:06

0

這是一個比應用程序更多的網絡管理問題。

考慮服務器(託管Java應用程序)是多宿主的。 也可以是三個地址: 1. 99.88.77.66(公網IP) 2. 10.10.10.10(私人,內部分配IP)

哪個IP將您的潛在客戶可以訪問取決於網絡配置。

客戶端可能會從公共IP訪問,但由於NAT,它將訪問您的專用IP。 又如,您的客戶端IP可能是192.168.10.10,通過NAT,它會訪問您的10.10.10.10 IP。

您無法通過任何種類的前綴匹配來計算正確的IP(發佈您的服務)。

你已經提到過,這是一個企業解決方案,而複雜的網絡配置在這種環境中很常見。

使用DNS,您的服務器主機可能是myapp.company.com DNS解決方案需要爲客戶端解析正確的IP。 您可能需要與網絡人員協調,在DNS中提供適當的支持, 該解決方案應該是微不足道的,並且更加健壯。

相關問題