BufferedReader readLine检测关闭的套接字并使用.ready()

时间:2013-10-06 18:20:59

标签: java sockets client-server bufferedreader readline

服务器代码段:

reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(connection.getInputStream())));
if (reader.ready()) {
    result = reader.readLine();
    if (result == null) {
         quit(); // handle closing the socket
    } else {
         // process result
    }
}

客户端代码段:

BufferedOutputStream os = new BufferedOutputStream(connection.getOutputStream());
OutputStreamWriter osw = new OutputStreamWriter(os, "US-ASCII");
osw.write("hello\n");
osw.flush();

问题:

当客户端向服务器写入内容时,它会被正确读取,但当客户端关闭它的套接字时(例如强制退出程序),reader.readLine()应该输出null,因为{{1 null结果永远不会到达if (reader.ready()) {。 如果我离开quit(),服务器将无法读取数据。

我该如何解决这个问题?

编辑:我不能使用if (reader.ready()) {因为我需要在此之后运行更多代码:

while ((result = reader.readLine()) != null) {

2 个答案:

答案 0 :(得分:0)

只需删除ready()测试即可。它是如此简单。 ready()不是流结束的测试。 readLine()将在没有数据时阻塞。

您必须在读取循环之外创建一次BufferedReader。否则你将丢失数据。

答案 1 :(得分:0)

我自己通过每5秒运行一段代码解决了这个问题:

try {
          BufferedOutputStream os = new BufferedOutputStream(thread_cnn.getOutputStream());
          OutputStreamWriter osw = new OutputStreamWriter(os, "US-ASCII");
          osw.write("areyoustillthere\n");
          osw.flush();

} catch (Exception e) { 
           quit(); // handle quit if server can't reach client
}