0

I have a program where users can guess a number. But when a user have guessed the right number, I want to block all the messages from all the clients for 5 seconds.

   for(ClientThread clients : clientThreads)
   {
       clients.SendGetalToServer(message);

       clients.sleep(5000);
       clients.interrupt();
   }

This works with Thread.sleep but after the 5 seconds the server and all clients received all the messages when I have typed in the 5 seconds of the Thread.sleep.

How can I fix this ?


I have a program where users can guess a number. But when a user have guessed the right number, I want to block all the messages from all the clients for 5 seconds. I whas trying with Thread.sleep(5000) this is working but after that 5seconds all the messages i have typed in the Thread.sleep period will be send to all the clients.

Below you find my original code. without Thread.sleep method

ServerThread

public class ClientThread extends Thread {

private Socket socket;
private Server server;
private PrintWriter out;
private BufferedReader in;
private Scanner scanner;

private String username = null;
private boolean isloggedIn = false;



public ClientThread(Socket socket,Server server)
{
    this.socket = socket;
    this.server = server;


}

public Socket socket()
{
    return  socket;
}


@Override
public void run() {
    try {
        out = new PrintWriter(socket.getOutputStream());
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        scanner = new Scanner(socket.getInputStream());

        String line = "";

        out.print("Kies een username: ");
        out.flush();



        while((line = scanner.nextLine()) != null) {




                if (!isloggedIn) {
                    username = line;
                    isloggedIn = true;
                    out.println("U heeft " + username + " gekozen");
                    out.println("kies een getal");
                    out.flush();
                } else
                {


                    int g = Integer.parseInt(line);


                    if (g == server.getTeradengetal()) {

                        server.broadcastGetal(username);
                        System.out.println(line);
                        server.setTeradengetal();



                    } else if (g > server.getTeradengetal()) {
                        out.println("Lower");
                        out.flush();
                        System.out.println(line);
                    } else if (g < server.getTeradengetal()) {
                        out.println("Higher");
                        out.flush();
                        System.out.println(line);
                    }

                }

            }

        } catch (InterruptedException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    }


}




public void SendGetalToServer(String message)
{
    sendMessage(message);
}

public void sendMessage(String message)
{
    out.println(message + " heeft het getal juist geraden");
    out.flush();
}

}

Server

public class Server {

private ServerSocket serverSocket;
private Socket socket;
private List<ClientThread> clientThreads;
private int teradengetal = 10;
private boolean juistgeraden = false;


public Server() throws IOException {

    serverSocket = new ServerSocket(6000);
    clientThreads = new ArrayList<>();







    while(true)
    {

        socket = serverSocket.accept();
        System.out.println("Client connected");
        ClientThread clientThread = new ClientThread(socket,this);
        clientThread.start();
        clientThreads.add(clientThread);




    }



}

public void setTeradengetal()
{


    this.teradengetal = (int) Math.floor(Math.random() * 10);
}



public int getTeradengetal()
{
    return teradengetal;
}

public void broadcastGetal(String message) throws InterruptedException {
    for(ClientThread clients : clientThreads)
    {
            clients.SendGetalToServer(message);
    }
}
Undo
  • 25,519
  • 37
  • 106
  • 129
  • 1
    Don't block the messages, just throw them away – zapl May 14 '16 at 13:37
  • I think there's quite a bit code missing. What is the code for ClientThread? – grizeldi May 14 '16 at 13:47
  • ok below you find my original code – user2978798 May 14 '16 at 14:00
  • Please have a look at my previous post on [client-server communication](http://stackoverflow.com/questions/22732835/multiple-clients-access-the-server-concurrently/22736352#22736352) – Braj May 16 '16 at 03:46
  • can you try with [BufferedInputStream.available()](http://docs.oracle.com/javase/6/docs/api/java/io/BufferedInputStream.html#available()) or [InputStreamReader.ready()](http://docs.oracle.com/javase/6/docs/api/java/io/InputStreamReader.html#ready()) to check for data availability instead of using `sleep` at client side. – Braj May 16 '16 at 03:50
  • `Thread.sleep()` is a `static` method. It causes the *current* thread to sleep. See the Javadoc. – user207421 May 16 '16 at 05:25

0 Answers0