[英]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遍歷,以找到通過家庭調制解調器/防火牆處理連接的方法。 我將注意到,企業防火牆是另一回事,其中許多技術將無法使用。
所以大概我建議您至少准備好以下四種情況
如果您不希望對所有這些可能性進行編程,那么選項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.