我的服务器中有以下代码,当我运行它时,它只会从我的客户端读取一次输入,然后跳出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。我做错了什么?
答案 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
。