Java inputstreamreader尝试阻止无限循环

时间:2015-08-11 21:27:01

标签: java loops try-catch java-io inputstreamreader

我的服务器中有以下代码,当我运行它时,它只会从我的客户端读取一次输入,然后跳出try块,最终结束while(true)循环。

public void run() {
      while (true) {
            try {
                inputStreamReader = new InputStreamReader(clientSocket.getInputStream());
                bufferedReader = new BufferedReader(inputStreamReader); 
                message = bufferedReader.readLine();
                System.out.println("this is message from client: " + message);
            } catch (Exception e) {
                //nope
            }
       //end of while
       break;
       }
}

我希望我的try块没有完成,它应该始终监听任何传入的消息。如果我从break循环中取出break语句,那么我会遇到一个无限循环,其中我的message = null。我做错了什么?

2 个答案:

答案 0 :(得分:2)

一旦连接关闭,就永远不会有新数据,即readLine()返回null后,就没有希望会有更多数据。

在连接关闭之前,您应该读取数据。你不能阻止另一端断开连接。

您应该只输入一次输入流。如果多次使用缓冲读卡器包装,则会丢失数据。

我建议你在循环外创建BufferedReader并在获取数据时保持循环。

try (BufferedReader br = new BufferedReader(new InputStreaReader(clientSOcket.getInputStream())) {

    for(String message; (message = br.readLine()) != null; ) {
        System.out.println("From client: " + message);
    }

} catch (IOException ioe) {
    ioe.printStackTrace();
}

答案 1 :(得分:1)

它只是一个无限循环,因为您未能检查流的结尾。 readLine()方法在流的末尾返回一个sentinel值:查找它;那么你应该停止阅读。

您通过每次迭代创建一个新的BufferedReader来丢失数据。不要这样做。在插座的使用寿命中使用相同的插座。

永远不要忽视例外而不至少记录原因;永远不要抓住你不需要抓住的例外。代码可以抛出的唯一检查异常是IOException