2016-12-26 2 views
0

私は大学のプロジェクトのためのシンプルなサーバークライアントのダイスゲームに取り組んでいます。ゲームの制限は、無限の数のプレイヤーが存在する可能性があることです。私は彼らのスコアのリストを作成しようとしていますが、次のプレーヤーが接続するたびにサーバーが新しい接続を受け入れるので、次のスレッドが開始されないようにすることはできません。Javaでのマルチスレッド - 未知のプレイヤー数のスコアリスト

私はプレイヤーを待っている間に "PLAY"ボタン/ブール変数のようなものを考えていましたが、ゲームが始まった直後に次のスレッドを開始することはできませんでした。助言がありますか?もう一つのアイデアも良い提案だろう:)ここ

は、サーバからのコードスニペットです:ここで

public void initializeResultList(int amountOfPlayers){ 
    final ArrayList<Object> resultDescription = new ArrayList(); 
    ArrayList<Object> zeros = new ArrayList(); 
    resultDescription.add("Player"); 
    resultDescription.add("One Pair"); 
    resultDescription.add("Two Pairs"); 
    resultDescription.add("Three of a kind"); 
    resultDescription.add("Full House"); 
    resultDescription.add("Four of a kind"); 
    resultDescription.add("Five of a kind"); 
    for (int j = 0; j < resultDescription.size(); j++){ 
     zeros.add(null); 
    } 
    resultList.add(resultDescription); 
    //fill with nulls, then there will be player Scores 
    for (int i = 1; i <= amountOfPlayers; i++){ 
     resultList.add(zeros); 
    } 

} 

public static void main(String args[]) throws IOException { 


    int portNumber = 444; 

    ServerSocket serverSocket = null; 


    try { 
     serverSocket = new ServerSocket(portNumber); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     System.out.println("Error finding port"); 
     System.exit(1); 
    } 

    // program loop 
    do { 
     Server server = new Server(serverSocket.accept()); 

     //HERE IS THE PROBLEM! 
     server.initializeResultList(2); // here should be passed the amount 
     server.start(); 
    } while (true); 

} 

@Override 
public void run(){ 
    System.out.println("Connection accepted"); 
    System.out.println("Client has successfully connected"); 
} 

は、プレーヤーのクラスからのコード(それは今問題ではありませんが、多分あなたは知っていただきたいと思いますですサーバーとプレーヤーがどのように通信するか):

public static void main (String args[]) throws IOException { 
    //Connect to the server 
    Socket socket = null; 
    int portNumber = 444; 
    String str; 
    BufferedReader br = null; 
    BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 
    PrintWriter out = null; 

    try { 
     socket = new Socket(InetAddress.getLocalHost(), portNumber); 
     br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     out = new PrintWriter(socket.getOutputStream(), true); 
    } catch (UnknownHostException uhe) { 
     System.out.println("Unknown Host"); 
     System.exit(0); 
    } 


    boolean quit = false; 

    while (!quit) { 

     str = input.readLine(); 
     out.println(str); 
    } 


} 
+0

質問を正しく読んでいれば、サーバーが処理を中止するためにクライアントから何らかの信号を受信するまで待つことができます。私。サーバーに生データを送信するのではなく、ヘッダー文字列( 'end-stream:false; data:yourstring'または 'end-data:true; data:yourstring'のようなもの)を追加し、サーバー上で解析します。処理を停止するときにスレッドにデータそのものを伝えるので、渡す数値を知る必要はありません。カーソルパターンのチェックアウトを検討してください。 –

+0

ええええええええええええええええええええええええええええええんは、サーバがより多くのスレッドに接続できないような行動をしているのですか?私はこの解決策をヘッダ文字列で受け取っていません:( –

+0

あなたは対処しようとしている根本的な問題は、本当にマルチスレッドと関係ないと思います。どのようにデータセットを送受信できるか考えてみてください。そのセットに関するメタデータを送信する必要があります。そのデータセットのサイズがわかっているか、そのデータセットが終了したときにトークンをサーバーに送信してください...実際には、実際には、非常に多くのスレッドを設定することは、コンピューティングリソースの点では非常に非効率的です。 –

答えて

0

これにはいくつかの実装が考えられます。気になるものには、選手の列が含まれています。したがって、新しいプレーヤーが接続するたびに、アプリケーションがそれをピックアップするまで待ち行列に座ります。キューサイズをローカルカウンタに追加して、合計プレイヤー数を取得することができます。あなたがプレイヤーを引っ張った後、彼はキューから退いた。 たとえば、次のようにキューを初期化することができます

Queue<YourObject> queue = new ConcurrentLinkedQueue<YourObject>(); 

私たちはので、あなたがhereを確認することができ、そのプロパティの同時リンクキューを拾います。各ラウンドの終了時に、たとえば、サーブレットで

queue.offer(myObject); 

中または新しいプレーヤーが必要なとき、あなたが呼び出すことができます:新しいユーザーを追加するとあなたがキューにプレーヤーを置くことができる

YourObject myObject = queue.poll(); 

たり、新しいプレーヤーの数が呼び出し得ることができます。

int nrNewPlayers = queue.size()

プレーヤ自体についての情報と統計情報を含むPlayerオブジェクトが必要な場合は、これが良い解決策です。あなたが本当に選手のちょうど合計数を必要とする場合は、そのキューは過剰であり、あなただけのfollwing方法でtomic integerを使用することができます。

//Initialize the integer in constructor 
public static AtomicInteger userCounter = new AtomicInteger(0); 

//Increment number of users when a new user is added() 
userCounter.incrementAndGet(); 

//Decrement the number of users when a user disconnects 
userCounter.decrementAndGet(); 

//Get number of users from within your code 
int counter = userCounter.intValue(); 

ので、あなたのサーバーのコードは次のようになります。

//HERE IS THE PROBLEM! 
int counter = userCounter.intValue(); 
server.initializeResultList(counter); // here should be passed the amount 

これは、私があなたが提供したコードを使って行うことができる最高のものです。より多くの助けが必要な場合は、新しい質問を作成し、スニペットの代わりにコードを提供し、必要なものをよりよく説明してください。これがあなたを助けてくれることを願っています。

+0

正確には?単純な例ですか?どのキューを使用する必要がありますか?Concurrent LinkedまたはDifferent? –