2015-08-31 87 views
1

我正在做一個android應用程序,允許用戶在線播放。兩個android設備之間的TCP連接(即使有NAT)

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

我想用一個帶有谷歌應用引擎的java servlet替換我的服務器。這個新的服務器將被用於連接兩個玩家。

它會以這種方式工作: 玩家A打開一個服務器套接字,然後發送到服務器的連接細節。 當玩家B想對戲,他問到服務器的端口號,他直接連接到A.

的問題是,我不知道,如果玩家A的背後是它會工作NAT。當播放器A打開一個服務器套接字時,會打開其192.168.x.y地址的一個端口,但它是否向端口請求端口轉發?我認爲它不...

所以兩個問題: 即使有NAT或防火牆時,是否可以在兩臺設備之間建立直接連接TCP(我不知道防火牆如何在Android上工作...) 如果這是不可能的,那麼最好的解決方案是什麼:是否有可能使TCP服務器確保與app引擎交換消息?

先謝謝您。

game

+0

'播放器A打開一個服務器套接字,然後發送到服務器的連接細節。'。對不起,但我甚至不能按照你的方案的第一句話。 – greenapps

+0

該項目(https://github.com/kaklakariada/portmapper)具有UPnP portmapping Java代碼,它可以在J2SE中運行,但不瞭解Android。我已經嘗試過,並在我的Thomson vdsl2路由器上正常工作。我在Java-gaming.org網站上找到了這個項目的鏈接(http://www.java-gaming.org/index.php?topic=22088.0) – Whome

回答

0

在不同NAT下的用戶之間創建直接的TCP連接大多是可能的。有4種類型的NAT。 FC,ARC,PRC,對稱。如果播放器A或B中的一個具有對稱NAT,則不可能創建TCP P2P連接。在這種情況下,你將不得不在中間使用一臺服務器來交換兩個玩家之間的數據。

對於其他類型的NAT組合,這是非常可能的,但不能保證。用於創建TCP P2P連接的技術稱爲TCP打孔。閱讀此answer以詳細瞭解此技術。

同時創建TCP P2P連接與任何平臺都沒有關係。

0

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

我相信大多數家用有線/ DSL調制解調器都支持uPnP(通用即插即用),它包括互聯網網關設備協議(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是最有可能工作的選項,即使它確實意味着額外的流量進出服務器。但請注意,對於公司網絡,他們可能只是有一條阻止未知連接的規則,並且可能沒有太多可以做的事情。

編輯:我能夠得到一個簡單的TCP服務器在Android上工作沒有任何關於Android本身的特殊,所以刪除了一個評論,說我不知道​​這一點。

相關問題