Java プロコンゲーム 〜Socket通信を実装する〜

イントロダクション

前回は、Socket通信の設計を行いました。
今回は、プロコンゲーム(プログラミングコンテスト向けゲーム)の作成を続きでSocket通信の実装を行います。

そして、前回作成した処理順を見ながら作成します。

処理フロー

Server

  1. サーバー起動、受付開始
  2. クライアント受付、プレーヤー登録
  3. スタートボタン押下
  4. バトルMapの表示
  5. キャラクター(Playerなど)配置
  6. クライアントへのレスポンス送信
  7. リクエスト受信
  8. 各キャラクターの操作と描画
  9. 操作後の情報をクライアントへレスポンス送信
  10. 7〜9を繰り返す

Client

  1. プレーヤー定義情報の読み込み
  2. サーバーへの接続
  3. プレーヤー定義情報の送信
  4. サーバーからのレスポンス受信
  5. 何かしらの処理(今後設計する)
  6. サーバーへリクエスト送信
  7. 4〜6を繰り返す
  8. 終了コマンドを受け取った時にアプリ終了

そして、自分の反省も踏まえ、設計をしないとどうなるか。。。以下に記載します。これも前回記載しています。

プログラムの実装の前に

前回、プロコンアプリを作成した時には、設計を行わないで実装したので、汚いソースができました。これらのコードは Githubにアップしてあります。

以前作成したゲームループ処理の記事もあるので参考にどうぞ。

ゲームループの実装イメージ

ServerSocketの実装

処理フローの通りに実装して行きます。
なので、とりあえずは入れ物→メソッドから作成して行きます。参考にするのはUMLクラス図です。

ここのConstructorと書いてあるのは「コンストラクター」で、このクラスのインスタンスを生成する時に実行する処理になります。
とりあえず、すぐに実装できるところは実装して見ます。実装してみると「あ、これも必要だな・・・」というところに気がつきます。とりあえずはプロコンサーバークラスのコードです。(第一段)

public class ProconServer extends Application {
    /** アクセスキー */
    public static final String ACCESS_KEY = "LetItBe";
    private SocketController serverSocket;

    @Override
    public void start(Stage primaryStage) throws Exception {
        // FXMLのロード
        Parent baseNode  = FXMLLoader.load(getClass().getResource("/ProconServer.fxml"));
        Scene scene = new Scene(baseNode);
        scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();

        // サーバーソケット作成
        serverSocket = new SocketController();
        // プレーヤー受付開始
        serverSocket.execute();

    }

    public static void main(String[] args) {
        try {
            launch(args);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

そのほかのクラスもありますが、その部分はクラス図と合わせて次回記載します。

補足

下の方に、補足情報を記載しておきます。
今までの記事(プロコンサーバー作成)にも記載している内容です。参考にどうぞ。

JavaFXの基本的なところ

細かい書き方などは下のリンク先に記載しています。

  1. UML 世界を作る 〜RPGでの世界を作る場合〜
  2. UMLの書き方(読み方)〜概要とクラス図〜
  3. UMLツール Star UML〜ユースケース図を書いて見た〜
  4. UMLツール 〜Star UMLを使う〜

javaFXはフレームワークです。なのでとりあえず下のように作成しました。参考にどうぞ。
JavaFXのパッケージにあるjavafx.application.Applicationを継承して作成します。
ここで、上のクラスを継承して実装することにより、画面表示を行うための細かい処理(Xサーバーへのアクセス及び、描画処理)を自分で作成しなくてよくなります。

つまり、作成するアプリに集中できるわけです。
その代わり、このフレームワークの使用方法を理解する必要があります。「JavaFXの〜」にあるリンクからOracleのドキュメントページに遷移できます。

自分の作成した記事は以下になります。
初心者でもわかる。。。というより作って動かして。。。とやってみるのが一番なのでその手順と実装サンプル、動かしてみたときのイメージを記載しています。

  1. JavaFX チュートリアル〜今度こそ、初めてでも大丈夫:Label〜
  2. JavaFX チュートリアル〜今度こそ、初めてでも大丈夫2:Label〜
  3. JavaFX チュートリアル〜今度こそ、初めてでも大丈夫3:Button〜

プロジェクトの作成方法

  1. プロジェクトエクスプローラーを右クリックします。
  2. JavaFXプロジェクトを作成します。
  3. プロジェクト名をつけます。使用するJDKは1.8です。JShellとか使用する予定がないので。。。

作成したプロジェクトは下のような感じです。

以前追加した、シーンビルダーというプラグインが入っているので、使用します。下は操作したときの動画です。今回作成するものではありませんので。。。

そして、作成したものは、下のような見た目です。

作成したときの動画は以下になります。途中で落ちましたが(笑)とりあえずは、使用するPCのスペックでメモリ不足(だと思う)により落ちる可能性があるので、File -> Save Asなどで時々保存すると良いと思います。

SceneBuilder

SceneBuilderは下のように作成しました。
SceneBuilderのセットアップはこちらを参照ください。

前回SceneBuilderを使用して作成した、FXMLは下のようEclipseのリソースフォルダへコピーしてプログラムから参照できるようにします。

まとめ

今回は、Socketを使用して実装するのにどう処理を行うかを考えました(設計しました)。
実装してみれば、Socket通信に関して理解ができると思います。
そして、低レベルAPIなので現在使用されるほとんどのデータ通信の土台になります。

つまり、ここがわかれば、他も理解できるということです。

今回はここら辺で。。。
でわでわ。。。

次回;Java プロコンゲーム 〜プレーヤー生成の設計準備〜

関連ページ

Java Basic

  1. Java Basic Level 1 Hello Java
  2. Java Basic Level2 Arithmetic Calculate
  3. Java Basic Level3 About String class
  4. Java Basic Level 4Boolean
  5. Java Basic Level 5If Statement
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 Traning of If statement
  8. Java Basic Level8 How to use for statement
  9. Java Basic Level 8.5 Array
  10. Java Basic Level 9Training of for statement
  11. Java Basic Level 10 While statement 
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1
  17. Java Basic JUnit 〜テストスイートの作り方〜


投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す