Java BufferedReader读取线检测关闭的套接字并使用.ready()
服务器代码段:Java BufferedReader读取线检测关闭的套接字并使用.ready(),java,sockets,client-server,bufferedreader,readline,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
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
,因为if(reader.ready()){
空结果永远不会到达quit()
。
如果我不使用if(reader.ready()){
,服务器将无法读取数据
我该如何解决这个问题
编辑:我不能在((result=reader.readLine())!=null){时使用,因为我需要在此之后运行更多代码,如下所示:
while (running) {
try {
reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(connection.getInputStream())));
if (reader.ready()) {
result = reader.readLine();
if (result == null) quit();
else // process result
}
catch (Exception e) { ... }
// more code
}
}
只需删除ready()测试。就这么简单。ready()不是流结束测试。readLine()将在没有数据时阻塞
您必须在读取循环之外创建一次BufferedReader。否则您将丢失数据。我通过每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
}
我不希望readline在这是数据之前阻塞(在有数据之前不会执行进一步的代码),这就是为什么我有ready()
测试。这样,您就永远无法检测到流的结尾。但因为您甚至没有“if reader.ready”()的“else”我不可能相信你的话,我想你误解了什么。