I am writing a multiplayer quiz application for two players (Clients) and I would like to have a mechanism which would allow only one player (the fastest to type the answer) to answer the question. So if for example: Player1 answers the question, Player2 immedietaly is moved to next question (just like Player1).
How can I make Server notify Client thread that the other Client answered the Question?
Client:
package com.company;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class Client
{
private static Scanner scanner;
private static BufferedReader serverReader;
private static PrintWriter serverWriter;
public static void main(String[] args)
{
try
{
connect();
}
catch ( Exception e )
{
e.printStackTrace();
}
}
public static void connect()
{
try( Socket clientSocket = new Socket( "localhost", 1236 ) )
{
scanner = new Scanner( System.in );
serverReader = new BufferedReader( new InputStreamReader( clientSocket.getInputStream() ) );
serverWriter = new PrintWriter( clientSocket.getOutputStream(), true );
String serverResponse;
while( ( serverResponse = serverReader.readLine() ) != null )
{
System.out.println( "[SERVER] - " + serverResponse );
break;
}
for( int i = 0; i < 3; i++ )
{
System.out.println( "[SERVER] - " + serverReader.readLine() );
System.out.print( "Your answer: " );
String answer = scanner.nextLine();
serverWriter.println( answer );
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}
Server:
package com.company;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class Server
{
private static final ArrayList< PrintWriter > writers = new ArrayList<>();
private static final ArrayList< BufferedReader > readers = new ArrayList<>();
private static final HashMap< String, Socket > players = new HashMap<>();
private static final ArrayList< Question > questions = new ArrayList<>();
public static void main( String[] args )
{
startServer();
}
public static void startServer()
{
questions.addAll( List.of( new Question( "2 + 2 = 4", "YES" ),
new Question( "2 + 2 = 6", "NO" ), new Question( "2 + 2 = 8", "NO" ) ) );
int i = 0;
try( ServerSocket serverSocket = new ServerSocket( 1236 ) )
{
while( i < 2 )
{
Socket socket = serverSocket.accept();
players.put( "Player" + ( i + 1 ), socket );
System.out.println( "[CLIENT] - " + "Player" + ( i + 1 ) + " has joined the server." );
i++;
BufferedReader clientReader = new BufferedReader( new InputStreamReader( socket.getInputStream() ) );
PrintWriter clientWriter = new PrintWriter( socket.getOutputStream(), true );
writers.add( clientWriter );
readers.add( clientReader );
}
writers.forEach( writer -> writer.println( "Game will start in 5 seconds" ) );
try
{
Thread.sleep( 5000 );
}
catch ( InterruptedException e )
{
e.printStackTrace();
}
for( Question question : questions )
{
writers.forEach( writer -> writer.println( question.getContent() ) );
// what to do now???
while( true )
{
// so server doesnt stop
}
}
}
catch ( IOException e )
{
e.printStackTrace();
}
}
}
Question:
package com.company;
public class Question
{
private final String content;
private final String correctAnswer;
public Question( String aContent, String aCorrectAnswer )
{
content = aContent;
correctAnswer = aCorrectAnswer;
}
public String getContent()
{
return content;
}
public String getCorrectAnswer()
{
return correctAnswer;
}
}