在Java中毫不拖延地打破用户输入?

时间:2011-06-28 15:15:00

标签: java sockets

我有一个从套接字读取的while循环,而不是计时器,我想要破解,关闭套接字并在用户输入上结束程序,但我不希望用户必须为每次阅读输入“1”或“继续”或“某事”。我只想要有来自用户的输入,断开和关闭,否则,如果没有干扰,继续。 我担心我将不得不使用计时器,我不想这样做,因为它会延迟从套接字接收,并且如果可能的话我需要很少或没有延迟。

是否有一些Java函数可以执行此操作或我缺少一个简单的解决方案?

修改

我不想等待用户输入。我只想继续,除非检测到用户输入,但重点是检查用户是否输入了什么没有延迟。我正在进行该程序,假设它应该继续,直到用户另有说法。

6 个答案:

答案 0 :(得分:1)

我想我已经确定你要指定一个超时期限?您可以通过调用Socket方法setSoTimeout(int timeout)来设置超时,也可以通过Socket构造函数指定它。见Socket API here

希望这有帮助。

答案 1 :(得分:1)

执行此操作的最佳方法可能是启动正在运行的线程,等待用户输入。如果检测到这个,那么线程可以设置一个在循环内检查的标志。

答案 2 :(得分:1)

如何将事件侦听器绑定到输入,以及是否有输入处理它(在这种情况下关闭套接字连接)

您有一个“类似”的样本here

编辑:没有完全阅读你的问题。以为你喜欢某种GUI。既然你没有那么你就做这样的事情(在Java中没有使用线程,所以这是“伪代码”但我希望你能得到图片):

public void start()
{
        Console console = System.console();
        if (console != null)
        {
                Thread th = new Thread(yourWorkerClass);
                th.run();

                //blocking
                String readLine = console.readLine("Do something: ", (Object[])null);
                th.stopYourWorkMethod(); 

        }
}

答案 3 :(得分:1)

您需要线程以满足您的要求。在主线程中打开一个从套接字读取的新线程,等待用户输入。当你得到输入时,你可以打断你的其他线程。

您可以执行Thread类,例如:

public class ClientThread extends Thread {
    private String address;
    private int port;

    ClientThread(String address, int port) {
        this.address = address;
        this.port = port;
    }

    public void run() {
        // connect to socket and start reading
        . . .
    }
}

然后在您的应用程序中使用它:

ClientThread c = new ClientThread("127.0.0.1", 4547);
c.start();

答案 4 :(得分:1)

您可以在输入流上执行isReady以查看是否有任何数据。在最简单的情况下,您可以睡眠指定的时间,然后检查isReady,然后根据需要继续或中止。如果你想在用户发送取消信号时立即响应,你可以有一个循环,它一直检查isReady并检查当前时间与开始时间,并在满足任一条件时中断。如果在等待这种情况发生时你想做一些其他的工作,你可以把它放在一个单独的线程中。 (在这种情况下,循环应该包含yield()以让其他事情发生。)

答案 5 :(得分:1)

你可能想要两个线程。

一个线程应该读取用户输入并将该“命令”放在与另一个线程共享的变量中。

第二个线程应该处理来自该变量的“命令”(您可能希望构建一个命令队列)。该线程应该等待命令放入队列中。

保存命令的变量(可能是队列)应该由synchronized块保护。第二个线程应该对正在进行同步的对象执行wait(),并且第一个线程在该对象上放置命令时应该对该对象运行notify()。

然后第二个线程可以处理命令并对它们做出反应,而不必等待用户输入(只要有要处理的命令)并在有事情要做时立即唤醒。