Rock-Paper-Paperオンラインゲームの例を使用したReddwarf:Client

Rock-Paper-Scissorsオンラインゲームの例を使用したJavaサーバーの作成に関するReddwarfの記事:Serverで、サーバーの作成方法を説明しました。 しかし、クライアントなしでそのようなサーバーでプレイすることは不可能です。 したがって、この記事では、最も単純なクライアントを作成し、サーバーで実験してみます。





仕事の準備



クライアントを開発するには、ここから sgs-client-dist-0.10.2.zipアーカイブにあるReddwarfクライアントライブラリをダウンロードします

プロジェクトを作成し、ダウンロードしたアーカイブのlibディレクトリからすべてのライブラリに接続します。



クライアントについて簡単に



奇妙なことに、コマンドラインクライアントを記述しようとすると、コードがより煩雑でわかりにくくなるため、クライアントはグラフィカルなSwingを実行します。

ゲームのクライアント部分は、クライアントとGUIの2つのクラスで構成されます。

クライアントはSimpleClientListenerインターフェースを実装します-接続/切断イベントとサーバーからのメッセージを受け取ります。 着信メッセージに応答して、クライアントはこれについてGUIに通知します。 さらに、プロトコルに関するすべての情報はこのクラスにのみ含まれるため、彼はメッセージの送信を担当します。



接続と認証



ポート62964で指定されたサーバーに接続します-これはReddwarfのデフォルトポートです。

認証には、最も単純な(おそらくReddwarfで最も頻繁に使用される)認証方法であるPasswordAuthenticationを使用します。 サーバーはパスワードを検証しないため、パスワードは空のままにします。



Client.javaコードを完全に

public class Client implements SimpleClientListener { private SimpleClient simpleClient; private final String host; private final String username; public static final String DEFAULT_PORT = "62964"; private final ClientFrame frame; public Client(String host, String username, ClientFrame frame) { this.host = host; this.username = username; this.frame = frame; simpleClient = new SimpleClient(this); } @Override public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, new char[]{}); } @Override public void loggedIn() { frame.loggedIn(); } @Override public void loginFailed(String s) { frame.setStatus("login failed " + username+": "+s); } @Override public void receivedMessage(ByteBuffer packet) { String text = Messages.decodeString(packet); if (text.startsWith("SCORE")) { frame.setScore(text); } else if (text.startsWith("BATTLE")) { frame.startBattle(text); } else if (text.startsWith("DRAW")) { frame.setBattleResult(text); } else if (text.startsWith("WON")) { frame.setBattleResult(text); } else if (text.startsWith("LOST")) { frame.setBattleResult(text); } else if (text.startsWith("ERROR")) { frame.setStatus(text); } } public void login() { try { Properties connectProps = new Properties(); connectProps.put("host", host); connectProps.put("port", DEFAULT_PORT); simpleClient.login(connectProps); } catch (Exception e) { e.printStackTrace(); disconnected(false, e.getMessage()); } } public void play() { try { simpleClient.send(Messages.encodeString("PLAY")); } catch (IOException e) { e.printStackTrace(); } } public void answer(String text) { try { simpleClient.send(Messages.encodeString(text)); } catch (IOException e) { e.printStackTrace(); } } }
      
      







ユーザーインターフェース



GUIは、入力フィールドとボタンを備えたシンプルなフォームです。









ClientFrame.javaフォームのソースコードは、 ここで表示できます。



Messages.javaクラスのコードは、前の記事の同じファイルに似ています。



走れ!



コードの準備ができたら、サーバーとクライアントを起動して、何が起こるかを確認できます。

サーバーを起動します。

  03, 2012 6:53:29 PM com.sun.sgs.impl.kernel.Kernel <init> INFO: The Kernel is ready, version: 0.10.2.1  03, 2012 6:53:29 PM com.sun.sgs.impl.service.data.store.DataStoreImpl <init> INFO: Creating database directory : C:\sgs-server-dist-0.10.2.1\data\dsdb  03, 2012 6:53:29 PM com.sun.sgs.impl.service.watchdog.WatchdogServerImpl registerNode INFO: node:com.sun.sgs.impl.service.watchdog.NodeImpl[1,health:GREEN,backup:(none)]@black registered  03, 2012 6:53:30 PM hello.reddwarf.server.Server initialize INFO: Starting new Rock-Paper-Scissors Server. Initialized database.  03, 2012 6:53:30 PM com.sun.sgs.impl.kernel.Kernel startApplication INFO: RockPaperScissors: application is ready  03, 2012 6:53:30 PM hello.reddwarf.server.OnlineLoggerTask run INFO: Online: 0
      
      





2つのクライアントを起動します。





一方のクライアントと他方のクライアントからログインします。



ご覧のとおり、両方のプレイヤーがアカウントに0ポイントを持っています。



サーバーログはそれほど長くかかりません。サーバーを初めて起動したときから、データベースにプレーヤーが存在しないため、プレーヤーplayer1とplayer2が自動的に登録されます。

  03, 2012 6:53:47 PM hello.reddwarf.server.Server loggedIn INFO: Client login: player2  03, 2012 6:53:47 PM hello.reddwarf.server.Server loadOrRegister INFO: Registering new player player2  03, 2012 6:53:48 PM hello.reddwarf.server.Server loggedIn INFO: Client login: player1  03, 2012 6:53:48 PM hello.reddwarf.server.Server loadOrRegister INFO: Registering new player player1  03, 2012 6:53:50 PM hello.reddwarf.server.OnlineLoggerTask run INFO: Online: 2
      
      







Playのプレイヤーの1つをクリックします-サーバーは自動的に2番目のプレイヤーを対戦相手として選択し、戦闘が始まります:





ログは、サーバーが新しいバトルを作成したことを示しています。 サーバーはプレイヤーの応答を待っています

  03, 2012 6:53:54 PM hello.reddwarf.server.Player play INFO: Choosing enemy for player1  03, 2012 6:53:54 PM hello.reddwarf.server.Battle <init> INFO: Created Battle{2} for {player1} and {player2}  03, 2012 6:53:54 PM hello.reddwarf.server.Battle start INFO: Started Battle{2}
      
      







プレイヤーの答え:



  03, 2012 6:53:56 PM hello.reddwarf.server.Battle answer INFO: Battle{2} Player {player1} answer ROCK  03, 2012 6:53:57 PM hello.reddwarf.server.Battle answer INFO: Battle{2} Player {player2} answer PAPER
      
      







サーバーは、戦闘時間の終了を待って合計します:



  03, 2012 6:53:59 PM hello.reddwarf.server.Battle finish INFO: Battle{2} finished. Answers: {player1}->ROCK {player2}->PAPER
      
      







クライアントでは、戦闘の結果とポイント数がどのように変化したかを確認できます。勝者は2ポイント、敗者はゼロを受け取りました。





データが保存されていることを確認するには、クライアントを切断し、サーバーを再起動してプレーヤーplayer2を再接続します。

 java -jar bin/sgs-stop.jar java -jar bin/sgs-boot.jar
      
      







クライアントによって接続されています:正直に獲得した2ポイントが保存されます。





再起動中に、次のメッセージがログに表示される場合があります(トレース付き)。

 WARNING: Task has been retried 25 times: com.sun.sgs.impl.service.session.ClientSessionServiceImpl$RemoveNodeSpecificDataTask[owner:app:RockPaperScissors] WARNING: Task has been retried 25 times: com.sun.sgs.impl.service.channel.ChannelServiceImpl$RemoveChannelServerProxyTask[owner:app:RockPaperScissors] WARNING: Task has been retried 50 times: com.sun.sgs.impl.service.session.ClientSessionServiceImpl$RemoveNodeSpecificDataTask[owner:app:RockPaperScissors] WARNING: Task has been retried 50 times: com.sun.sgs.impl.service.channel.ChannelServiceImpl$RemoveChannelServerProxyTask[owner:app:RockPaperScissors] WARNING: Task has been retried 75 times: com.sun.sgs.impl.service.session.ClientSessionServiceImpl$RemoveNodeSpecificDataTask[owner:app:RockPaperScissors] WARNING: Task has been retried 75 times: com.sun.sgs.impl.service.channel.ChannelServiceImpl$RemoveChannelServerProxyTask[owner:app:RockPaperScissors]
      
      







これらは、サーバーの起動時に共通のサーバーオブジェクトへの多数の同時呼び出しがあるために表示されます。 Reddwarfのマルチスレッドは非ブロック同期に基づいているため、競合するトランザクションは拒否され、アクションを実行するための2回目の試行が行われます。 プラットフォームは、同じトランザクションの多数のロールバックでメッセージが記録されるように構成されます。 サーバーの起動時にこれらのメッセージは問題になりませんが、サーバーの動作中にこのようなメッセージが表示されると、サーバーロジックコードのボトルネックが示されます。



クライアントとサーバーのソースコードはcode.google.comにアップロードされ、SVNからダウンロードできます。

  svn checkout http://reddwarf-rock-paper-scissors-example.googlecode.com/svn/trunk/ reddwarf-rock-paper-scissors-example-read-only 


ソースをいじりたくない場合は、クライアントとサーバーのコンパイル済みバージョンをcode.google.com/p/reddwarf-rock-paper-scissors-example/downloads/listで見つけることができます。

クライアントは次のコマンドを使用して起動されます
  java -jar HelloReddwarfClient.jar 


サーバーを起動するには、deploy.jarファイルをsgs-server-dist-0.10.2.1 / deploy /ディレクトリにコピーして、サーバー開始コマンドを実行する必要があります。
  java -jar bin / sgs-boot.jar 




ご清聴ありがとうございました。 私は建設的な批判に喜んでいるでしょう。



All Articles