簡體   English   中英

兩個Android設備之間的TCP連接(即使使用NAT)

[英]TCP connection between two android devices (even with NAT)

我正在做一個允許用戶在線玩的android應用。

當前,我使用TCP服務器:當兩個人連接時,該服務器負責在兩個客戶端之間轉發數據包。

我想用帶有Google App Engine的Java Servlet替換我的服務器。 此新服務器將僅用於連接兩個播放器。

它將以這種方式工作:播放器A打開服務器套接字,然后將連接詳細信息發布到服務器。 當玩家B想要與A對抗時,他向服務器詢問A的端口號,並直接連接到A。

問題是,如果播放器A位於NAT之后,我不確定它是否會起作用。 當播放器A打開服務器套接字時,該服務器套接字打開了其192.168.xy地址的一個端口,但是是否向包裝盒詢問端口轉發? 我認為那不是...

所以有兩個問題:即使有NAT或防火牆,也可以在兩個設備之間建立直接連接TCP(我不知道防火牆在Android上是如何工作的...)如果不可能,那怎么辦?最佳解決方案:是否可以制造一個TCP服務器以確保與App Engine交換消息?

預先謝謝你。

游戲

首先,設備本身可能不會成為主要問題。 如果他們在家中並使用WiFi,則可能必須處理電纜調制解調器/ DSL調制解調器,該調制解調器通常包括防火牆。 另外,如果他們在工作(或酒店,會議中心等),則可能需要處理公司防火牆。

我相信大多數家用電纜/ DSL調制解調器都支持uPnP(通用即插即用),其中包括Internet網關設備協議(IGD),旨在讓設備確定外部IP地址並設置端口映射。 通常,您可以查找NAT遍歷,以找到通過家庭調制解調器/防火牆處理連接的方法。 我將注意到,企業防火牆是另一回事,其中許多技術將無法使用。

所以大概我建議您至少准備好以下四種情況

  1. 沒有任何問題的直接連接。 您可以通過在播放器首次與服務器聯系時讓服務器建立測試連接來進行測試。 如果這可行,那么事情就簡單了。
  2. 了解uPnP的家用NAT設備。 如果您有10.xxx,172.16.xx-172.31.xx或192.168.xx號(典型的家庭WiFi),則可以嘗試設置NAT遍歷,如果可以,則可以將適當的信息發送到服務器。 為了確保一切正常,服務器進行測試連接可能是值得的。
  3. 如果您有無法繞過的防火牆,請在服務器上記錄有關玩家A的信息,然后當B嘗試加入A的游戲時,查看B是否會接受連接,如果是,則安排A參加連接到B。
  4. 如果以上方法均無效,則讓A和B都連接到服務器,並使服務器在A和B之間中繼消息。

如果您不希望對所有這些可能性進行編程,那么選項4是最有可能起作用的選項,即使它確實意味着去往/來自服務器的額外流量。 但是請注意,對於公司網絡,它們可能只是阻止未知連接的規則,因此您可能無能為力。

編輯:我能夠在Android上獲得一個簡單的TCP服務器,而沒有任何關於Android本身的特殊要求,因此刪除了一條評論,說我對此一無所知。

通常可以在不同NAT下的用戶之間創建直接TCP連接。 NAT有4種類型。 FC,ARC,PRC,對稱。 如果播放器A或B中的一個具有對稱NAT,則無法創建TCP P2P連接。 在這種情況下,您將必須使用中間的服務器在兩個播放器之間交換數據。

對於其他類型的NAT組合,這很有可能,但不能保證。 用於創建TCP P2P連接的技術稱為TCP打孔。 閱讀此答案以了解有關此技術的詳細信息。

另外,創建TCP P2P連接與任何平台都不相關。

暫無
暫無

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

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