2012-06-05 30 views
3

我們開發了一個客戶端應用程序和一個服務器應用程序。客戶端使用http協議與服務器進行通信,併發送一些數據以供服務器處理。如何自動檢測服務器?

我們的結構允許我們將服務器安裝在任何地方。我可以在同一個客戶端網絡上,甚至在雲上。

當服務器託管在雲上時,向用戶詢問服務器地址是有意義的(因爲如果用戶希望它可以改變),但當服務器與服務器位於同一網絡時,這是沒有意義的客戶。除此之外,我們目前正在要求用戶配置服務器IP /名稱以連接到服務器。

爲了避免這種情況(詢問用戶的地址),我開發了一個基於UDP的發現服務。客戶端廣播一條消息,表明服務器用它的地址回答。它在某些情況下可以工作,但當用戶擁有某種防火牆,代理甚至防病毒軟件時不會發生這種情況。

我已經閱讀了很多關於發現服務的內容,最喜歡的是Bonjour

所以,問題是:什麼是服務器時,沒有客戶端被攔截的防火牆,代理服務器等在同一網絡上發現一個服務器的IP的最好方法?

+0

客戶端是否要求防火牆允許入站UDP數據包到您選擇的端口? –

+0

我不能。我的軟件分佈廣泛,所以我無法控制它運行的環境。 –

回答

1

你可以保持您的服務純粹是本地(企業內網),並建立在你現在正在使用通過實施hole punching什麼的頂部。你可以通過防火牆,但我真的不知道AV軟件政策。

或者您可以在互聯網上建立一個衆所周知的基於http的發現服務。

  1. 服務器開始活躍起來,將其(本地)IP地址發現服務(持續發送保持活動)
  2. 在啓動時,客戶端將查詢發現服務,標識本地子網他在,並獲取服務器的本地IP地址。

這當然會在您的系統中創建一個單點故障,因爲如果發現服務啓動存儲桶,您的客戶端將無法找到服務器。您可以通過複製服務和/或引入退守機制(比如你有純粹的地方發現),這你可能想無論如何做補救。如果本地子網中的計算機不共享外部IP地址(那麼它取決於本地子網是爲您服務的),唯一的問題是子網標識。