2012-04-04 18 views
15

私は、基本的にマルチプレイヤー(2人以上のプレーヤーのように)の古典的な戦艦ゲームのバリエーションを開始しています。Android P2P(直接接続)インターネット経由(NATの後ろ)

私がコーディングに飛び込む前に解決しようとしている1つの問題は、複数のプレーヤー間の通信の問題です。現在の可能性は、中央HTTPサーバーを通信用の中心ハブとして使用することです(HTTPサーバーからデバイスへのプッシュ通信を可能にするためにAndroid C2DM APIと結合されています)。理論的には、インターネットにアクセスできる限り、NATの背後にいるかどうかに関係なく、完全に動作するはずです。

しかしながら、提案された解決策は、既存の単一障害点/余分な負荷(ウェブサーバ)の欠点を有する。だから私は他のオプションを試してみたい。私はクライアント間でソケットを使って直接接続することを考えましたが(ウェブサーバーを最初のミーティングポイントとして使用するだけです)、これはすべてのデバイスが同じネットワーク上にある場合にのみうまくいくでしょう。今日私たちはほとんど常にルータのNATの背後にあると考えてどのように私は直接通信を達成することができますか?私はホールパンチングについて読んできましたが、よく書かれている(良い使用例を含んでいます)、そして確かにAndroid上で動作する良いライブラリは見つかりません。また、ほとんどの(もしそうでなければ)ホールパンチング技術(STUN、ICEなど)は広く普及しており、オーディオ/ビデオやリアルタイムマルチプレイヤーゲームではうまくいくUDPでしか動作しませんが、ベースのゲームでは、各ターンのデータの配信を保証することが重要です(UDPで直接行うことはできません)。

信頼できるホールパンチング(好ましくはTCP経由)を実現する方法はありますか?Android NATの背後にあるデバイスは?ケースの100%で動作する必要はありません(一部の見知らぬNATはサポートされないかもしれませんが)。ほとんどの場合、うまくいくでしょう。

+0

Win Myo Htetが提示した解決策は、(Google独自のインフラストラクチャを使用する)優れた可能性を秘めています。しかし、私はまだAndroid上のTCPおよび/またはUDPホールパンチングの良いソリューションに興味があります。 – petersaints

+0

あなたは何を@petersaintsに仕上げましたか? – kishu27

答えて

8

xmpp経由でsmack over gtalkを使用してください。サーバーと単一障害点について心配する必要はありません。 Googleがそれについて心配させてください!テトリスを書いて、gtalkを通信層として使っている2人のプレイヤーと対戦するようにしています。 http://code.google.com/p/tetrads-drop-lite/プレイヤーを増やしたい場合は、MUCを試すことができます。

+0

私はXMPPの使用も考えました。どのバージョンのSmackを使っていますか?元のプロジェクトはAndroid用に作られていないが、いくつかのポートがあるようだ。 また、XMPP経由でデータを送信するのは簡単ですか?あなたはテキストを送ることができますか、バイナリデータを送ることができますか? – petersaints

+0

私はバイナリを使用していませんが、ソースは少し変更する必要があります。バイナリをMUCではなく2人のプレーヤー間でファイル転送することができます。しかし、その時点では、バイナリ転送は、Googleがどのようにプロトコルと実装を実装したかの違いから非常に堅牢ではないため、堅牢ではありません。良いニュースは、新しいスムーズバージョンが最近出ていて、それがファイル転送に対処しているということです。私はまだそれをチェックしていないtho。 –

+0

さて、そうです!それはうまくいくかもしれない。ヒントをありがとう。あなたが使ったSmackのバージョンがここから来たものかどうか(私はこれが公式のものだと思います):http://www.igniterealtime.org/downloads/index.jsp#smackそうでなければ、どのAndroidポートを使いましたか? 私はそのメッセージを後で受け入れたものとしてマークします。私はまだ直接TCP/UDP接続に興味がありますが、これは素晴らしい回避策です(そしておそらくホールパンチよりもハッキリです)。 – petersaints

0

あなたはかなり仲介者を使用することを余儀なくされています。いくつかのNATデバイス間でTCP接続を確立するための仕組みをNatblasterで調べることはできますが、両方のデバイスをルーティングすることなくAndroidで使用できるものではありません。それでも、それは実験的なものです。

jabberのような既存のフェデレーションメッセージングシステムを使用するのが最も良い方法です。

0

UDPは信頼性の高い配信ではありませんが、UDPパケットの送信に確認応答が必要であることを要求することによって信頼性を高めることができます。これは、他のいくつかの要件とともに、TCPをIP上で信頼できるものにする(信頼性が低い)ものです。

これは実装することは可能ですが、おそらく時間がかかり、費用対効果はあなたの状況ではうまくいかない可能性があります。

関連する問題