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();
}
我的服务器中有下面的代码,当我 运行 它时,它只会从我的客户端读取一次输入,然后跳出 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();
}