Java inputstreamreader 尝试阻止无限循环

Java inputstreamreader try block infinite loop

我的服务器中有下面的代码,当我 运行 它时,它只会从我的客户端读取一次输入,然后跳出 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 块不会完成,并且它应该始终侦听任何传入的消息。如果我从 while 循环中取出 break 语句,那么我会遇到一个无限循环,其中我的消息 = null。我做错了什么?

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

每次迭代都创建一个新的 BufferedReader,您正在丢失数据。不要那样做。套接字终生使用同一个。

并且至少在记录原因之前永远不要忽略异常;永远不要捕获不需要捕获的异常。代码可以抛出的唯一检查异常是 IOException.

一旦连接关闭,就永远不会有新的数据,即一旦 readLine() returns null 就是这样,就没有希望有更多的数据了。

你应该做的是读取数据直到连接关闭。您无法阻止另一端断开连接。

您应该只包装一个输入流一次。如果多次用缓冲 reader 包装它,您将丢失数据。

我建议您在循环外创建 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();
}