web-dev-qa-db-ja.com

Androidインターネット経由のP2P(直接接続)(NATの背後)

私は小さなプロジェクトを始めています。基本的には、古典的な戦艦ゲームのマルチプレイヤー(2人以上のプレイヤーのように)のバリエーションです。

コーディングに取り掛かる前に解決しようとしている問題の1つは、複数のプレーヤー間の通信の問題です。現在の可能性は、中央のHTTPサーバーを通信の中央ハブとして使用することです(HTTPサーバーからデバイスへのプッシュ通信を可能にするAndroid C2DM APIと組み合わせて))これは素晴らしい解決策のようです、理論的には、インターネットにアクセスできる限り、NATの背後にいるかどうかに関係なく、完全に機能するはずです。

ただし、提案されたソリューションには、既存の単一障害点/追加の負荷(Webサーバー)という欠点があります。だから私は他のオプションを試してみたいと思います。クライアント間でソケットを使用して直接接続することを考えました(Webサーバーを最初のミーティングポイントとして使用するだけです)が、これはすべてのデバイスが同じネットワーク内にある場合にのみうまく機能します。今日、私たちはほとんどの場合、ルーターのNAT)の背後にいることを考えると、直接通信を実現するにはどうすればよいですか?穴あけについて読んでいますが、十分に文書化されている優れたライブラリが見つかりません。 (良い使用例を含む)そしてそれは確かにAndroidで動作します。また、広く利用可能なほとんどの(すべてではないにしても)穴あけ技術(STUN、ICEなど)はUDPでのみ動作します、これは一部のメッセージを失う可能性のあるオーディオ/ビデオおよびリアルタイムのマルチプレーヤーゲームには問題ありませんが、マルチプレーヤーのターンベースのゲームでは、各ターンのデータの配信を保証することが重要です(UDPでは直接不可能です)。

では、NATの背後にあるAndroidデバイス間で(できればTCPを介して)信頼性の高い穴あけを実現する方法はありますか? 100%のケースで機能する必要はありませんが(一部の見知らぬNATはサポートされていない可能性があります)、ほとんどのケースで機能するのであれば便利です。

20
petersaints

gtalkを介してxmppを使用します。サーバーと単一障害点について心配する必要はありません。グーグルにそれについて心配させてください!テトリスは、コミュニケーションレイヤーとしてgtalkを使用して2人のプレイヤーと対戦できるように作成しました。 http://code.google.com/p/tetrads-drop-lite/ より多くのプレーヤーが必要な場合は、MUCを試すことができます。

8
Win Myo Htet

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

注意として、これは実装可能ですが、おそらく時間がかかり、コスト/メリットが状況によってうまくいかない場合があります。

1
user892607

あなたはほとんど仲介者を使うことを余儀なくされています。一部のNATデバイス間でTCP接続を確立するために機能するメカニズムについてNatblasterを検索できますが、root化せずにAndroidで使用できるものではありません。両方のデバイスそしてそれでも、それは実験的です。

おそらく、Jabberのような既存のフェデレーションメッセージングシステムを使用するのが最善です。

0
vipw