web-dev-qa-db-ja.com

マルチプレイヤーでの課題Android RESTfulな性質を持つゲームサーバー

私は大学のサマーインターンシッププロジェクトの一環として、Androidゲームベースの コントラクトブリッジ に取り組んでいます。ゲームは4 =のようなマルチプレイヤーになりますAndroidデバイスで再生できるため、開発するBOTやCPUプレーヤーはありません。プロジェクトを取得した時点で、ほとんどの学生がすでにプロジェクトに取り組んでいるが、作品はどれもないことに気付きました現在、再利用可能です(文書化されていないコードや設計アーキテクチャ、さまざまなプラットフォームの実装など、さまざまな理由で)。

私はいくつかのオープンソースプロジェクトに取り組んだ経験があるので、私が作成したコンポーネントが可能な限り再利用できるように、このプロジェクトに取り組むことに重点を置いています。現在、ゲームはマルチプレイヤーであり、ゲームの進行状況全体がサーバー上で処理されるため、現在サーバーの設計に取り組んでいます。どのクライアントプラットフォームでも使用できるようにゲームサーバーを再利用できるようにしたかったので、以前は- SocketまたはRESTの選択で混乱 ゲームサーバーの設計用ですが、後でサーバーのREST APIで動作するようになりました。

さて、ゲーム内で移動する間、すべてのプレーヤーを同期させておく必要があるため、サーバーでは、各テーブルに固有のすべてのプレーヤーの進行状況を維持するデータベースを使用する予定です(Bridgeでは、4人のプレーヤーが1つのテーブルでプレイします) 、およびサーバーはそのような多くのゲームテーブルを処理します)。

データベースを共有媒体として使用して各ゲームテーブルの進行状況を追跡するのが適切かどうかはわかりません(適切なオプションまたはより優れたオプションがあるかどうかを知らせてください)。明らかに、テーブルのゲームが完了すると、サーバーのデータベース上のそのテーブルのデータは破棄されます。

ここで問題となるのは、RESTサービスへのアクセスはHTTP呼び出しであるため、クライアントが要求を行わない限り、サーバーはアイドル状態のままであり、次のような状況を考慮することです。

  • プレーヤーが自分のデバイスでカードをプレイし、デバイスがこの変更をサーバーに適用するように要求しました。
  • 次に、残りの3つのデバイスに、プレーヤーがカードをプレイしたことを通知し、デバイスのビューを更新する必要があります。
  • AFAIK、RESTは、サーバーへの接続が永続的ではないため、一種のプッシュ通知システムを提供できません。
    • 私が考えた解決策の1つは、各デバイスがサーバーに変更を常にポーリングし(56ミリ秒ごとなど)、変更が見つかったらそれをデバイスに反映させることでした。しかし、すべてのHTTPリクエストは高額であるため、これはエレガントな方法ではないと思います。 (そしてRESTを選択すると、ゲームプレイエクスペリエンスを堅牢にするため、モバイルデバイスはインターネットから切断される傾向があり、ソケットのような持続的な接続がある場合、ゲームの進行全体が失われる可能性があります。また、 、クライアント側での移植性が重要です)
  • また、10個のゲームテーブルが進行中で40人のプレーヤーがプレイしている状況を想像すると、サーバーは56ミリ秒ごとに発生するすべてのデバイスからのフラッディングされたHTTP要求を処理できる必要があります。ですから、DoS攻撃を想定しているのではないでしょうか。

それで、状況を説明して、私はサーバー設計のための正しい軌道に乗っていますか?コードをさらに進める前に、確認したかったのです。

2
Kushal

サーバーとの間でデータを送受信するためにrestを使用することは良い選択であり、クライアント/サーバー通信のためのよく知られた安定したプロトコルです。ただし、サーバー上で変更があったときに更新(または通知)をクライアントにプッシュするシステムが必要です。そのためには、http Web接続以外のものが必要です。

Androidデバイスでは、Pushテクノロジーを使用するのが最善です。Googleには 少数のサイトその話実装について この種のものです。通知を受け取ったときに、まだデータが含まれていない場合、それをアプリのトリガーとして使用して、通常の方法でデータを取得できます(つまり、「更新」を自動的にクリックします)ボタン)

プッシュシステムを使用したくない場合、もう1つの答えは、プレーヤーがアクティブにプレイしているときにサーバーに対して永続的なtcp/ipソケットを開き、それを介して通知とデータを直接受信することです。

1
gbjbaanb

checkout jWebSockets 、An Android websocketプロトコルの実装。サーバーにsocket.ioのようなものがあり、モバイルデバイスにwebsocketクライアントがあると、作業が楽になります。

双方向TCP=ソケットになり、プッシュは必要ありません。

0