简体   繁体   English

我想在此程序中设置一个计时器,以便在经过一定时间后它将退出循环

[英]I want to set a timer in this program so that it will break out of the loop if a certain period of time has passed

The point of the code is a game to connect to client and then make them guess a button... the input is then read and compared to to what was generated. 代码的重点是一个连接客户端的游戏,然后让他们猜测一个按钮……然后读取输入并将其与生成的内容进行比较。 I wish to set a time limit to how long the client has to enter this before the server shuts down. 我希望为服务器关闭之前客户端必须输入的时间设置一个时间限制。

   while(true)
        {
           try
            {

            //accept a client connection
            Socket GameServer = SSocket.accept();



            //let the server know the game is starting 
            System.out.println("Starting game...");

            //generate random number
            randnum = new Random();
            //make it be a button from 0-12
            thebutton = randnum.nextInt(11);
            //acknowledge which button was generated
            System.out.println("Button " + thebutton + " turned on");

            //writes server message to client
            BufferedReader in = new BufferedReader(new InputStreamReader(GameServer.getInputStream()));
            //make the button guessed = to whatever the client has entered
            input = in.readLine();
            //let the server know the clients response
            System.out.println("Button press acknowledged \nPlayer pressed button " + input);
            //let the client know the server acknowledged the response. 
            PrintWriter out = new PrintWriter(GameServer.getOutputStream());

            //convert user input from string to int
            buttonguess = Integer.parseInt(input);
            //compare input against number generated
            if (buttonguess == thebutton)
            {
                //if it's right print that the button is correct
                System.out.println("Player pressed the correct button");
                //add one to user score
                points += 1;
            }

            else
            {
                //if it's wrong then game over let the user know this
                System.out.println("Incorrect button pressed\nGame over!");
                //let the user know what score they have got
                System.out.println("Score = " + points);
                break;
            }

        //DataOutputStream confirmation = new DataOutputStream(SSocket.getOutputStream());

        //confirmation.writeBytes("I got your message"); //Responds to client using the DataOutputStream
        }// End try

        //if the time runs out 


        //if the number entered is incorrect format (not a number)
        catch(NumberFormatException n)
        {
            //let the user know there was a problem with their input
            System.out.println("Game over you didn't enter a proper input better luck next time \n");
            //print their score
            System.out.println("Your Score is = " + points);
            break;
        }

                catch(SocketTimeoutException a)
        {   

            System.out.println("Time up \n Game over!");
            System.out.println("Your Score is = " + points);
            //exit program
            break;
        }// End catch
        //if any kind of error occurs (usually connection error then do the following)
        catch(IOException e)
        {
            //print that error
            e.printStackTrace();

            // exit the program
            break;
        }// End catch
    }// End while()

Reader.read methods, including readLine are blocking, so you can't combine them with a timeout. Reader.read方法(包括readLine正在阻塞,因此您无法将它们与超时结合使用。

Instead you can use Reader.ready to first test if the stream can be read without blocking (ie whether there is any input to read). 相反,您可以使用Reader.ready首先测试是否可以无阻碍地读取流(即,是否有任何输入要读取)。

So you could do something along these lines: 因此,您可以按照以下方式进行操作:

    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String input = null;
    long maxWait = 5000; // 5 seconds
    long endTime = System.currentTimeMillis() + maxWait;
    boolean timeout = false;
    while (!reader.ready()) {
        synchronized(reader) {
            reader.wait(250);
        }
        if (System.currentTimeMillis() >= endTime) {
            timeout = true;
            break;
        }
    }
    if (!timeout) {
        input = reader.readLine();
    } else {
        System.out.println("timeout without input");
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM