2011-11-29 17 views
0

私は3つのクラスを持っています。サーバが起動すると、guessCountと乱数を持つrandomGameオブジェクトが作成されます。クライアントが起動すると、サーバに接続し、その番号をサーバに渡してguessメソッド(コンソール入力番号付き)を再生し、生成されたrandomGameの乱数を推測します。Javaマルチスレッドとオブジェクト

しかし、次のような問題があります。クライアントは毎回番号を入力し、guessCount &の乱数は再初期化されます(つまり、乱数は異なり、guessCountは増分できません)。私は乱数を実行している各クライアントプログラムで同じにし、guessCountは推測メソッドが実行されるたびに1ずつインクリメントされます。

public class Game { 
    private int num; 
    private int guessCount; 
    Game (int num) { 
     this.num = num; 

     System.out.println("guessCount = " + guessCount); 
     System.out.println("num = " + num); 
    } 

    public int guess (int ran) { 
     int result; 

     guessCount++; 
     if (this.guessCount >= 10) { 
      return -2; 
     } else if (ran < num) { 
      return -1; 
     } else if (ran > num) { 
      return 1; 
     } else { 
      return 0; 
     } 
    } 
} 

はここRandomGame

class RandomGame extends Game { 
    RandomGame() {   
     super(0 + (int)(Math.random() * ((90 - (0)) + 1))); 
    } 

    public static void main (String args[]) { 
    } 
} 

だここで、サーバーの:

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

public class Q4Server { 
    public static void main(String arg[]) { 
     try { 
      ServerSocket ss = new ServerSocket(12345); 
      while(true) { 
       Socket s = ss.accept(); 
       ClientHandler ch = new ClientHandler(s); 
       ch.start(); 
      } 
     } catch(IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 
} 

ここでは、クライアントハンドラです:

class ClientHandler extends Thread { 

    Socket socket; 
    RandomGame g; 

    public ClientHandler(Socket socket) { 
     this.socket = socket; 
     g = new RandomGame(); 
    } 

    public void run() { 
     try { 
      DataInputStream dis = new DataInputStream(socket.getInputStream()); 
      DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 

      int x = dis.readInt();  

      int reply = this.g.guess(x); 
      System.out.println("reply = " + reply); 
      dos.writeInt(reply); 

      //System.out.println(reply); 
      //System.out.println(reply); 

      socket.close(); 
     } catch(IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 
} 

答えて

0

あなたの問題はClientHandler.run()方法です。終了する前に3つ(または多くの必要な)推測をループする必要があります。あなたのソケットクライアントは同じことをする必要があります。あなたが現在それを持っている方法は、クライアントは、各推測のために個別にサーバーに接続している - あなたが必要とするものであるなし「会話は」ありません:

public void run() { 
    try { 
     final int guessMax = 3; 

     for (int i=0;i<guessMax;i++) { 
      DataInputStream dis = new DataInputStream(socket.getInputStream()); 
      DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); 

      int x = dis.readInt();  

      int reply = this.g.guess(x); 
      System.out.println("reply = " + reply); 
      dos.writeInt(reply); 
      dos.flush(); 

      //System.out.println(reply); 
      //System.out.println(reply); 
     } 

     socket.close(); 

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

お役に立てば幸いです。

+0

効果なし(....... – hkguile

0

あなたがいることを実行しないサーバの起動には、それはguessCount と乱数とrandomGameオブジェクトを作成するときに

を書いたシングルトンRandomGameインスタンス

0

を使用してみてください...クライアントが接続するたびにそのオブジェクトを作成します(クライアントハンドラコンストラクタの各クライアントに対して新しいRandomGameオブジェクトが作成されます)

あなたがQ4server.main(...)に、そのオブジェクトの作成を移動し、すべてのクライアントハンドラに渡す必要があります

guessCountは揮発性でなければなりません(あなたは、パラメータとしてそれを取るために、コンストラクタシグネチャを変更する必要があります)

1

@ DarkSquirrel42と@jowierunは間違いありませんが、私は答えを広げて別の方法を提供したいと思います。

今すぐクライアントが接続され、新しいゲームが作成され、推測が行われ、サーバーは返信と切断を行います。クライアントが再び接続すると、新たな乱数で新しいゲームが与えられます。クライアントに同じゲームを持っている状態はありません。

問題に3つの可能な解決策があります。

  1. は、クライアントが推測の間、サーバーへの接続を維持することができます。したがって、クライアントが最初に接続するときに乱数が選択され、複数の推測が行われるときにクライアントとサーバーが接続されたままになります。これは、@ jowierunがあなたにやろうとしていたものです。

  2. クライアントは、ランダム番号を選択し、その都度サーバーと通信できます。したがって、クライアントは接続時に2つの整数を書きます。しかし、これはいくらかばかげたサーバーの必要性を完全に取り除きます。

  3. サーバーは、推測の間に各クライアントの状態を保持できます。これを行うには、いくつかの方法があります。サーバは、Mapに各クライアントのIPに関連付けられたGameを格納することができます。これはもちろん、IPあたり1クライアントがある場合にのみ機能します。あなたはSocketからIPを得ることができます。

    1つの問題は、ゲームの「タイムアウト」です。あなたはサーバーが実行中のゲームを永遠にキャッシュしたくないでしょう。サーバを接続しているクライアントが毎回ゲームを調べて、それを見て、ある期間よりも古いものを投げ捨てるようになるたびに、ゲームにcreatedMillisフィールドを追加する必要があります。

希望します。

関連する問題