2011-09-28 16 views
7

学校プロジェクトでは、Javaでマルチプレイヤーゲームを作成することになっています(クライアント/サーバーでなければなりません)。宿題ではない)。ゲームは順番に行われますが、リアルタイムでチャットが行われる必要があります。しかし、私たちの誰もネットワークプログラミングの経験はありません。私が読んだことが多くなればなるほど、私の持つ疑問が増えています。Javaマルチプレイヤーゲーム - ネットワーキングの概念

私の最初の考えは、マルチプレイヤー部分を実装するためにソケットAPIを使用することでした。サーバーは、クライアントからの新しいデータを待ちます。ただし、チャットメッセージや移動などのように、受信するデータは複数あります。また、サーバーへの接続が確立されると、プレーヤー名などの初期データが送信される必要があります。サーバーは受信したメッセージの種類を確認できるはずですが、どうすればよいでしょうか?私は文字列フィールドtypeでクラスMessageを作成することを考えていました。しかし、私のサーバーコードで、私はこのようなコードを取得します:

は(とがあるでしょう)送信するデータの種類が多い場合には、これが最も効率的な方法のようには見えません。また、これは、サーバーとクライアントの両方がこのMessage-class/interface(重複コード)を持つ必要があることを意味します。

他のゲームの内容はどうですか?例えば、プレイヤ1は、キャラクタを他のキャラクタを倒す位置に移動させる。プレーヤ1のクライアントは、この敗北を計算し、正しい動作を適用する。しかし、何をサーバーに送るべきですか?新しい選手の位置だけでなく、敗北か?最初のオプションでは、他のすべてのクライアントが計算を行う必要があることを意味します。これは何のトラブルを引き起こすことはできませんでしたか?私は以前のネットワークプログラミング経験がないので、これらのことをどうやって行うのかちょっと混乱しています。

私はここでもStackoverflowの別のスレッドでRMIが良い選択肢かもしれないと読んでいます。これに関するいくつかの情報を読んで、私はRMIが何であるかを理解していますが、それがこのプロジェクトにとって良い選択かどうかまだ分かりません。これについてのヒント?

ご覧のとおり、私はこのプロジェクトのネットワーキングの部分から始めるには少し混乱します。私はいくつかのゲームプログラミングブック(Java forcourse用)を検索しましたが、それらのどれもネットワーキングの部分に焦点を当てていません。私はJavaネットワーキングブックも検索しましたが、これは良いコードプラクティスではなく、技術に焦点を当てているようです。

誰かが良い本を知っていたり、適切な服薬についてアドバイスをいただければ、大変感謝しています。

おかげ

+7

"...これを学校でプログラミングするので、 。クラシック。 – CPerkins

+0

少なくとも彼はコードを望んでいません。 –

+0

@CPerkins:私たちはこのプロジェクトを学校でやっています。私は誰にも私の仕事をするよう求めているわけではなく、単にこれをどうやって実装するのかアドバイスを求めるだけです。 – Bv202

答えて

7

あなたは正しい道にしているが、解消するためのいくつかのものがあります。

ソケットを使用している場合は、プロトコルを定義する必要があることが分かりました。これは、移動とゲームの状態を通信するための相互言語です。ソケットを使用すると、任意の形式であらゆる種類のデータを送信できます。この型を送信するためにクラスMessageをシリアライズすることを考えているようですが、これは処理の1つです。独自のプロトコルを持つRMIを使用すると、Javaメソッドを呼び出しているかのように動作しますが、本質的にはデータを直列化してソケットで渡すことで同様のことを行っています。

クライアントとサーバーの間でコードを共有することについて暗黙のうちに間違っていることはありません。実際、ほとんどのサービスは何らかの形でこれを行います。クライアントとサーバーは共に、共用ライブラリーを使用して渡されるメッセージ・クラスを定義することができます。 RMIはメソッドスタブを使用してインタフェースを決定します。あらゆる種類のWebサービスはメソッドの呼び出し方法を定義します。一般的な考え方は、実装ではなくインタフェースのみを公開することです。

コードに関しては、メッセージタイプごとに異なるMessageサブクラスを持つ方がクリーンで、メッセージごとに追加のパラメータを設定できます。あなたは、その後のようなMessageProcessorクラスかもしれない:

class MessageProcessor{ 
    void process(Move1Message m) {...} 
    void process(Move2Message m) {...} 
    .... 

} 

を送信するために何についての - 一般的な原理は、クライアントがサーバに自分の動きを送信するための責任があるということである必要があり、それがない何か他のものはボーナスは、あるサーバー理由移動の合法性を検証する必要があります。サーバーは不正行為や誤ったクライアントの実装を避けるために常にゲームの状態を決定する必要があります

独自のプロトコルを実装する方法やJavaソケットライブラリを使用する方法を学ぶことに興味がない限り、 RMIを使用します。 SOAP、REST、その他のプロトコルを使用することもできますが、現時点でどのプロトコルを使用するかについてはあまり気にしません。 the RMI documentation以外の提案はありませんが、this bookにはネットワーキングのコード例がたくさんあると思います。

0

ソケットと一緒に行く、各クライアントは、サーバのスレッドが(クライアント側でストリームをフラッシュすることを忘れていないか、またはあなたは永遠に待っています)

をお待ちしておりますそれぞれの行がされる上で自身の接続の必要がありますメッセージの種類を区別するために、各メッセージの先頭に「ヘッダー」(最初は特定の3文字のシーケンス)を使用すると、msg,mov,lgnとなり、スイッチでtrieのような選択をすばやく決定できますあなたが持っているもの


wh RMIを使用すると、クライアントがソケット実装の接続と同じ "接続"オブジェクトを要求できるマネージャオブジェクト(エクスポートおよびレジストリに登録されている)をサーバーに保持させることができますが、コールバックはいくつかの方法で(ソケットを使用して準備ができている状態で)行う必要がありますが、それぞれの目的に応じたメソッドを用意することです。