web-dev-qa-db-ja.com

全二重ゲームサーバーを実装するためのソリューション?

Android=端末に使用するゲームサーバーを設計しています。双方向ソケット通信に使用する製品またはフレームワークを探していましたが、言及する価値のあるものが見つかりませんでした。

簡単に言えば、以下のアーキテクチャを実装したいと思います。

Server architecture

言い換えると、常に接続する必要がないように、1つのTCPクライアントからサーバーへの接続と、別のサーバーからクライアントへの接続です。

明確にするために、私の主な目的はserverclientにデータを送信できるようにすることですwithoutクライアントが明示的に要求する必要がありますそれ。私はnotクライアントにサーバーをポーリングして、新しいデータがあるかどうかを確認する必要があります。

このアーキテクチャの実装には、設計戦略、ネットワークプロトコル、製品またはフレームワーク(存在する場合)のどの組み合わせが適切ですか?

7
A.Quiroga

問題は、クライアントがNAT /ファイアウォールの背後にあることが多いことです。つまり、クライアントはグローバルにルーティング可能なため、TCPクライアントへの接続を開始できません。 IPアドレスおよび/またはファイアウォールが予期しない着信をブロックするためTCPサーバーからのパケット。

つまり、TCP接続はクライアント側から開始する必要があります。これが完了すると、TCP接続を開いたままにするオプションがあります無期限に(これはしたくない)、またはTCP接続を閉じるとすぐにビジネスに参加したときに(ただし、クライアントがさらに接続する必要があるかどうかを確認するために、後で再度接続する必要があります)その間に更新が到着しました。これはポーリングですが、これも実行したくないです)。

だからあなたは一種の行き詰まりです。考えられる唯一の解決策は、ファイアウォール/ NATの背後にないプロキシサーバーをいくつかセットアップし、Androidクライアントが永続的にそれらに接続するようにすることです。プロキシサーバーは、メインサーバーにリクエストを送信し、プロキシを制御するため、サーバーが必要に応じてプロキシに接続できることを確認できます。運が良ければ、他の誰かがすでにこのようなシステムをセットアップしていて、簡単にそれを便乗して...多分 this はあなたが望むことをするでしょう。

8
Jeremy Friesner