簡體   English   中英

通過nat幫助與套接字通信

[英]Help communicating with sockets through nat

我想在java中創建一個簡單的p2p messenger,我已經設法與同一網絡中的2台計算機進行通信但是當我嘗試從網絡外部向另一台計算機發送消息時,消息正在消失...我知道我可以在路由器中轉發,但我不想這樣做,我想讓它像雅虎,gtalk或其他即時服務器那樣做。 我認為他們使用nat系統來做到這一點,但我不知道如何:D。

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

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

我認為是對的嗎?

非常感謝你!

你的NAT描述幾乎是正確的。 您所犯的唯一錯誤是Peter所指出的 - 客戶端始終是啟動連接的錯誤。

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

如果一方在NAT后面而另一方有公共IP,那么如果NAT后面的那個啟動連接就可以了。 在這種情況下,NATing路由器將記住從服務器發送響應的位置。

最后,如果雙方都在NAT之后,看起來似乎無法建立連接,但實際上並非總是如此。 有一個被稱為“ 打孔 ”的技巧。 這是一種白魔法並不總是有效,但它的工作經常足以被Skype成功使用,例如。

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

我重復; 客戶端是創建連接的客戶端,無論是在您的網絡上還是在Internet上。

您提到的所有其他系統都使用具有眾所周知的公共IP的服務器來幫助客戶相互通信。 每個客戶端與服務器通信,服務器將每個消息發送到適當的客戶端。 這可能是唯一的方法,因為否則:

  • 每個客戶都應擁有公共IP,以便其他客戶與他聯系。 每個客戶端也應該充當客戶端和服務器。
  • 發現客戶端非常困難,因為您需要知道他們的IP

您的系統可能在本地網絡中工作,但它不能在Internet上工作。 網絡中的每台計算機都有一個本地網關為其分配的本地IP。 除非有將公共IP映射到它的NAT設置,否則本地IP對外人是不可見的。 還必須有傳出消息的設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM