2010-12-16 113 views
3

我想在java中創建一個簡單的p2p信使,我設法與同一網絡中的兩臺計算機進行通信,但是當我嘗試從網絡外部向另一臺計算機發送消息時,正在消失......我知道我可以在路由器中前進,但我不想那樣做,我想讓它像雅虎,gtalk或其他im服務器那樣做。 我認爲他們使用NAT系統來做到這一點,但我不知道如何:D。幫助通過NAT與套接字進行通信

有人能解釋我NAT如何工作,如果這是解決我的問題的方式?

我讀到我需要服務器的靜態和公共IP,當客戶端(使用私有IP)向服務器發送請求時,他的NAT將知道如何處理來自服務器的消息下一次...但是如果客戶端不向服務器發送請求,並且服務器向客戶端發送數據包,則NAT不知道將數據包發送到網絡內部(到客戶端)的位置。

我想是不是正確?

非常感謝!

回答

5

你幾乎在你的NAT描述中是正確的。你所犯的唯一錯誤就是彼得指出的 - 客戶始終是啓動連接的人。

現在,如果雙方都有公有IP,一切都很好,任何一方都可以成爲服務器。

如果一方位於NAT後方,另一方位於公共IP地址,那麼NAT後面的位置啓動連接即可​​。在這種情況下,NATing路由器會記住從服務器發送響應的位置。

最後,如果雙方都支持NAT,看起來不可能啓動連接,但實際上並非總是如此。有一個技巧叫做「hole punching」。這是一種白色魔法,它並不總是有效,但它通常足以被Skype成功使用。

+0

此外,某些路由器允許通過UPNP定義動態端口轉發,但必須啓用它。如果雙方都支持NAT,那將是我推薦的方式。 – ZeissS 2010-12-16 09:23:58

+0

謝謝你的回答,現在我明白了這個過程! – Cata 2010-12-16 09:41:10

+0

也就是說,如果您有權訪問這些路由器。如果一臺路由器屬於你的ISP,那會​​起作用嗎? – 2010-12-16 09:43:04

0

客戶機按定義發起請求,服務器請求併發送回應的響應。假設客戶端可以被信任進行網絡連接,服務器則不能。順便說一句:在某些網絡上,客戶甚至不信任這樣做,並且必須使用代理。

我重複一遍;客戶端是創建連接的客戶端,無論是在您的網絡上還是在互聯網上。

0

您提到的所有其他系統都使用具有衆所周知的公共IP的服務器來幫助客戶相互通信。每個客戶端與服務器進行通信,服務器將每條消息發送給相應的客戶端。這也許是唯一的方法,否則:

  • 每個客戶都應該有一個公共IP,以便其他客戶能夠聯繫到他。每個客戶端也應該作爲客戶端和服務器。
  • 這將是非常難以發現的客戶,你需要知道他們的IPS

您的系統可能局域網內工作,但它不會在互聯網上工作。網絡中的每臺計算機都有本地網關分配的本地IP。這個本地IP對外人來說是不可見的,除非有NAT設置將公共IP映射到它。此外,還必須有傳出消息的設置。

+0

並非每個ISP都提供本地IP地址。我有兩個互聯網連接,其中一個通過PPP爲我提供公共IP,並且幾乎總是一樣的。即使有時會改變,我也會建立DynDNS。另一個連接使用了固定的私有IP,但後來我要求他們將IP切換爲公共。現在我有一個固定的公共IP,但我必須付錢(儘管很少)。 – 2010-12-16 08:54:23

+0

當然,但如果您創建家庭網絡,第二臺計算機將獲得本地IP。事實上,如果您使用的是路由器,那麼甚至您的第一臺計算機也可能擁有本地IP,並且對您的公共IP無所知曉。 – kgiannakakis 2010-12-16 09:12:19

相關問題