2012-04-04 148 views
15

我開始一個小型項目,基本上是一個多人遊戲(如兩名以上玩家)的變體經典戰艦遊戲。安卓P2P(直接連接)通過互聯網(在NAT後面)

我在潛入編碼之前試圖解決的一個問題是多個玩家之間的溝通問題。目前的可能性是使用中央HTTP服務器作爲通信的中心樞紐(加上Android C2DM API以允許從HTTP服務器到設備的推送通信)。這似乎是一個很好的解決方案,因爲從理論上講,只要你能夠訪問互聯網,無論你是否支持NAT,它都應該能夠完美工作。

然而,所提出的解決方案具有存在單點故障/額外負載(web服務器)的缺點。所以我想嘗試其他選擇。我想在客戶端之間使用Sockets進行直接連接(Web服務器只是作爲初始會議點),但是如果所有設備都在同一個網絡中,那麼這種方式只能工作得很好。考慮到今天我們幾乎總是在路由器的NAT後面,我該如何實現直接通信?我一直在閱讀關於打孔技術的知識,但是我找不到任何有很好文檔記錄的良好庫(包含很好的使用示例),並且確實適用於Android。另外,大多數(如果不是全部的話)衝孔技術(STUN,ICE等)只能用於UDP,這適用於音頻/視頻和實時多人遊戲,可能會丟失一些消息,但對於多人遊戲機基於遊戲的保證交付每個回合的數據是非常重要的(這是UDP不可能直接實現的)。

因此,任何想法如何實現在Android設備後面NAT的可靠打孔(最好是TCP)?它不必在100%的情況下工作(一些陌生的NAT可能不被支持),但如果它在大多數情況下工作,它將會很好。

+0

Win Myo Htet提供的解決方案具有很好的潛力(它使用Google自己的基礎架構)。不過,我仍然對Android上的TCP和/或UDP打孔解決方案感興趣。 – petersaints 2012-04-04 16:34:16

+0

你最終以@petersaints結束了什麼? – kishu27 2017-04-26 21:08:15

回答

8

使用xmpp通過敲擊gtalk。您不必擔心服務器和單點故障。讓谷歌擔心這一點!我寫了俄羅斯方塊使它與兩個使用gtalk作爲溝通層的玩家對戰。 http://code.google.com/p/tetrads-drop-lite/如果你想要更多的玩家,你可以試試MUC。

+0

我也想過使用XMPP。你使用了什麼版本的Smack?看起來,原始項目不是爲Android構建的,但有一些端口。 另外,通過XMPP發送數據很簡單嗎?你只能發送文本或有可能發送二進制數據? – petersaints 2012-04-04 16:11:41

+0

我不使用二進制文件,但我需要進行一些更改。您可以將二進制文件作爲兩個玩家之間的文件傳輸發送給MUC。然而,那時候,二進制轉換並不那麼健壯,因爲谷歌已經實現了協議的不同以及實現本身並不十分健壯。好消息是,新的smack版本最近出來了,它已經解決了文件傳輸,我聽說。我還沒有檢查過這個。 – 2012-04-04 16:24:24

+0

嗯,是的!這可能會起作用。感謝您的提示。你能否告訴你使用的Smack版本是否來自這裏(我認爲這是官方版本):http://www.igniterealtime.org/downloads/index.jsp#smack如果不是,你使用的是什麼Android端口? 我會將郵件標記爲稍後接受。因爲我仍然對直接的TCP/UDP連接感興趣,但這是一個很好的解決方法(可能比打孔更簡單)。 – petersaints 2012-04-04 16:31:47

0

你幾乎被迫使用中介。您可以查看Natblaster的機制,該機制可用於在某些NAT設備之間建立TCP連接,但這並不是您可以在不使用任何設備的情況下使用Android的情況。即便如此,它是實驗性的。

最好的可能是使用現有的聯合消息系統,如jabber。

0

UDP不可靠傳遞,但是你可以通過要求發送UDP數據包要求確認返回來使其可靠。這和其他一些要求一樣,是使TCP在IP上可靠(這是不可靠的)。

作爲一個說明,這是可能實現的,但可能會耗費時間,並且成本/收益可能無法解決您的情況。