アフィリエイト広告を利用しています

広告

posted by fanblog

ネットワーク対戦型ゲームその3-1

前回TCPについてお話したので、今回はそのサンプルプログラムを〜
2回にわけて載せてみます。

プログラムを載せる時にうまくいかなかったのでもしかしたら
不備があるかもしれません(汗
そのときはご指摘お願いします。

このサンプルでは、サーバに接続しているクライアントすべてのウインドウ内のマウスの位置を
各クライアントウインドウに色を分けて表示するものです。

まずはサーバプログラムですが、マルチアクセプトのために
ネットで調べたものを参考にさせてもらいました。

まずはサーバのメインクラス



import java.io.IOException;
import java.net.*;

//サーバを起動し、接続要求に応答するクラス
//接続完了後はMainServerThreadへ処理を譲渡する
public class MainServer {
 
  //サーバスタートメソッド
  //引数にポート番号を指定
  public void start(int port){

    //サーバソケットの作成
    //サーバソケットは接続待機用のソケット
    ServerSocket server;

    //接続数を制限する場合は指定
    int acceptCount = 0;

    try{

      //ポート番号を指定してサーバを作成
      server = new ServerSocket(port);
      System.out.println("Server Start!\n" + "This server name is " +
        InetAddress.getLocalHost().getHostName() + "\n" +
        "And port is " + port);

      //仮に接続制限を10としてサーバを作成する
      while(acceptCount < 10){

        try{
          //TCP通信で用いるソケットの作成
          //ひとまずnullで初期化をしておく
          Socket socket = null;

          //サーバソケットによる待機
          //接続相手が現れれば先ほど生成したsocketへ受け渡す
          socket = server.accept();

          //受け取ったソケットを引数にMainServerThreadのオブジェクトを生成する
          new MainServerThread(socket).start();

          //クライアントとの接続が完了すればカウントしていく
          acceptCount++;

        }catch (IOException e){
          e.printStackTrace();
        }
      }

    }catch (IOException e){
      System.err.println(e);
    }
  }

  //サーバのメインメソッドである
  public static void main(String[] args) {
    //自身のオブジェクトを生成
    MainServer server = new MainServer();
    
    //serverオブジェクトのstartメソッドを引数60000をしていして起動
    server.start(60000);
  }
}


続いてサーバの通信スレッドクラス
このクラスで各クライアントとの通信をマルチスレッドで処理します



import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

//各クライアントと通信を行うクラス
public class MainServerThread extends Thread{
  //リストとして各クライアントとの通信処理を行っているオブジェクトを格納する
  private static List<MainServerThread> threads = new ArrayList<MainServerThread>();
 
  private Socket socket;

  //何番目に接続したかを記録する
  private int number = 0;

  //コンストラクタ
  public MainServerThread(Socket socket){
    this.socket = socket;

    //クライアントとの通信を開始するのでリストに自身を追加してやる
    threads.add(this);

    //リストのindexOf()メソッドを使用することで引数の要素が何番目に含まれるか取得する
    number = threads.indexOf(this);
  }

  //スレッド処理
  public void run(){
    InputStream in = null;
    String message;
    int size;
    byte[] w = new byte[10240];

    try{
      //ストリームの生成
      in = socket.getInputStream();

      //受信ループ
      while(true){
        try{
          //クライアントからの受信待ち
          if(size <= 0) throw new IOException();

          //受け取ったバイトデータを文字列へ変換
          message = new String(w, 0, size, "UTF-8");

          //全てのクライアントへ送信する
          //受け取ったデータの前にクライアント識別ナンバーを付与する
          this.sendMessageAll(number + ":" + message);

        }catch (IOException e){
          e.printStackTrace();
        }
      }

    }catch (IOException e){
      e.printStackTrace();
    }
  }

  //全員にメッセージ送信
  public void sendMessageAll(String message) {
    MainServerThread thread;

    //リストに含まれている要素の数だけ繰り返す
    for (int i=0;i<threads.size();i++) {

      //リストからオブジェクトを取り出す
      thread=(MainServerThread)threads.get(i);

      //threadが存在して入れば処理を行う
      if (thread.isAlive())
      //そのスレッドのsendMessageメソッドを使用する
      //すなわち呼び出し元である自分から見れば
      //サーバを仲介して別のクライアントへデータを送信している
      thread.sendMessage(this, message);
    }
  }

  //メッセージ送信
  public void sendMessage(MainServerThread talker,String message){
    try {
      //ソケットから書き込み用のストリームを受け取る
      OutputStream out = socket.getOutputStream();
      byte[] w = message.getBytes("UTF8");
      out.write(w);
      out.flush();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}


この記事へのコメント

   
×

この広告は30日以上新しい記事の更新がないブログに表示されております。