2012-11-23 382 views
2

我想在一些計算機之間建立點對點連接,因此用戶可以在沒有外部服務器的情況下聊天和交換文件。我的第一個想法是如下:Java:服務器/客戶端 - >客戶端/客戶端

我做一箇中央的ServerSocket的服務器,所有應用程序都可以連接到。此ServerSocket跟蹤連接的套接字(客戶端),並將新連接的客戶端的IP和端口提供給所有其他客戶端。 每個客戶端都會創建一個新的ServerSocket,所有客戶端都可以連接到該客戶端。

enter image description here

換句話說:每個客戶端有連接的所有其他客戶端一個ServerSocket。消息應該通過圖像中的藍線。

我只運行一個小問題:如果我通過所有不同的IP地址測試它,它工作正常,但是當兩個客戶端具有相同的(外部)IP地址時,它不再工作。有人知道這個聰明的解決方案嗎?

謝謝!馬克

回答

2

當主機在NAT路由器後面,想要打開它應該是從NAT的另一端訪問的服務器端口,NAT路由器必須被配置爲轉發此端口上的所有進來的連接這個主機。

很明顯,NAT路由器不能配置爲爲偵聽同一端口的兩個不同主機執行此操作。它不知道哪個主機應該處理每個輸入連接。當NAT後面有兩臺服務器時,他們必須使用不同的端口,並且必須將NAT路由器配置爲將每個端口轉發到每臺服務器。

這是一個已知的問題,用於點對點網絡。其結果是兩個NAT後面的客戶端之間的直接連接只有當它們的至少一個NAT被配置爲端口轉發並因此可以充當另一個的服務器時纔可能。

解決方案:

一種解決方法來連接其被鎖定後的兩個客戶非轉發的NAT是添加使用第三個客戶端,它是服務器能夠爲它們之間的中間人的能力。

當兩個客戶在同一個NAT後面,他們可以通過中央服務器交換他們的局域網IP,並利用這些相互連接。

+0

我的回答不是真的,所以我添加了兩種可能的解決方法。 – Philipp

+1

即使沒有端口轉發,也是可能的。 Skype做到了。當我第一次讀到他們如何做時,我幾乎不能相信它真實的作品。如果我沒有記錯,您需要一臺服務器來建立連接並交換IP地址。通常,任何一方的NAT都會讓流量通過屬於此NAT的客戶端實例化的連接。困難的部分是讓兩個NAT都認爲相應的客戶端啓動了連接。我相信這是在這裏描述:http://www1.cs.columbia.edu/~library/TR-repository/reports/reports-2004/cucs-039-04.pdf – Axel

+0

爲了驅動自己的NAT的端口映射:http ://en.wikipedia.org/wiki/Universal_Plug_and_Play#NAT_traversal – Aubin

0

如果試圖使這一工作在互聯網上,你應該看看STUN。我不知道是否有可用的「即用型」圖書館,但本文應該讓你開始。