簡體   English   中英

Java-通過套接字進行通信

[英]Java - communication through sockets

比方說,在一個程序中,有能力連接到插座和服務器(這是我自己的電腦 - 本地主機),並擁有所有的通信服務器和背面(接收和發送消息像聊天服務)的處理。 如果我這個節目作為一個.jar文件發送給其他兩個用戶各自的機器,用戶執行程序,它會連接到這個插槽和服務器。 如果一切都設置正確(正確地寫入,並從插座InputStream和outputstreams讀取),並顯示在GUI聊天框中的消息,將在兩個用戶能夠使用此聊天服務溝通?

是的,但是阻止用戶執行此操作的主要障礙是網絡地址轉換 (NAT)。

簡而言之,連接到Internet的絕大多數計算機都沒有自己的唯一公共IPv4地址(而且絕大多數也沒有IPv6地址,因為ISP拖延了推出IPv6的步伐,但這是另一回事完全)。

專用服務器通常確實具有(通常是多個)唯一的IPv4地址,但是通常只有運行自己的自治系統的托管公司才能使用大量的IP地址-即使那樣,如今購買IP的價格也非常昂貴,因為它們一個有價值的和稀缺的商品。

無論如何,在某種家庭Internet連接(例如電纜,DSL或光纖)上的兩個隨機用戶幾乎可以肯定具有執行NAT的某種路由器調制解調器 ,從而為每個用戶設備(計算機,平板電腦等)提供了自己的專用設備。 LAN IP,而不是為每個設備提供唯一的公用IP。

這意味着默認情況下,NAT網關會忽略來自公共Internet的入站連接。 因此,如果您嘗試打開朋友公共IP的套接字,除非已正確配置該網關(調制解調器/路由器),否則它將無提示地忽略您的連接嘗試,並且您將收到超時或“連接被拒絕”類型的消息。

有幾種技術可以解決此問題,但是其中大多數要么需要更復雜的應用程序網絡代碼,要么需要用戶在路由器配置頁面中打亂(休閑用戶通常不願意這樣做)。

  • 端口轉發 :用戶必須手動配置其路由器,以將公共IP端口“轉發”到特定的私有IP,從而允許對公共IP的連接嘗試通過 “網絡地址轉換”表傳遞到私有LAN。 由於路由器/網關設備之間的差異,沒有通用方法可以自動執行此操作而無需用戶干預。
  • NAT遍歷 ,它需要在程序中實現多種NAT-T協議之一, 並且需要所涉及的路由器(您和您的朋友的)明確支持所需的NAT-T協議。 有許多不同的NAT-T協議可用。 您需要根據兼容性,可用性等來決定使用哪個。
  • 使用中介服務器作為間接在兩者之間路由數據包的方式:在這種情況下,您在公用Internet上創建一個服務器,該服務器確實具有唯一的IP(或具有轉發到其的端口),並且擁有兩台客戶端計算機中的每台啟動到該服務器的出站連接。 該服務器將接受來自客戶端的連接,然后再處理數據包,並通過他們,想通過中間人與人交談。 這不需要在客戶端上進行任何特殊配置,只要它們可以在所需的端口上進行出站連接(默認情況下,大多數可以,除非在受限的企業環境中,您的端口可能僅限於80和443之類的少數端口)。 )

你需要采用這些技術,如果您的客戶端使用NAT之一。 如果您的一個客戶端具有直接連接到其計算機的靜態IP並可以直接接受傳入連接(不使用NAT),則只要NAT背后的用戶使用靜態IP 發起 該客戶端的連接,您的程序概念就無需修改即可工作IP。

暫無
暫無

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

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