私は大学のプロジェクトのためのシンプルなサーバークライアントのダイスゲームに取り組んでいます。ゲームの制限は、無限の数のプレイヤーが存在する可能性があることです。私は彼らのスコアのリストを作成しようとしていますが、次のプレーヤーが接続するたびにサーバーが新しい接続を受け入れるので、次のスレッドが開始されないようにすることはできません。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);
}
}
質問を正しく読んでいれば、サーバーが処理を中止するためにクライアントから何らかの信号を受信するまで待つことができます。私。サーバーに生データを送信するのではなく、ヘッダー文字列( 'end-stream:false; data:yourstring'または 'end-data:true; data:yourstring'のようなもの)を追加し、サーバー上で解析します。処理を停止するときにスレッドにデータそのものを伝えるので、渡す数値を知る必要はありません。カーソルパターンのチェックアウトを検討してください。 –
ええええええええええええええええええええええええええええええんは、サーバがより多くのスレッドに接続できないような行動をしているのですか?私はこの解決策をヘッダ文字列で受け取っていません:( –
あなたは対処しようとしている根本的な問題は、本当にマルチスレッドと関係ないと思います。どのようにデータセットを送受信できるか考えてみてください。そのセットに関するメタデータを送信する必要があります。そのデータセットのサイズがわかっているか、そのデータセットが終了したときにトークンをサーバーに送信してください...実際には、実際には、非常に多くのスレッドを設定することは、コンピューティングリソースの点では非常に非効率的です。 –