Java中的BufferedReader在尝试从已关闭的套接字

时间:2016-12-27 07:37:21

标签: java multithreading sockets tcp bufferedreader

我连接TCP套接字并在其自己的线程中为该套接字上的I / O打开缓冲读取器,然后使用缓冲读取器上的readLine读取数据:

try {
  socket = new Socket(targetHost, targetPort);
  ou = new PrintWriter(socket.getOutputStream(), true);
  in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

  while (true) {
    message = in.readLine();
    ...
    process the data
    ...
  }
} catch (Exception e) {
  e.printStackTrace();
  return;
}

只要连接存在,这就可以正常工作。但是当TCP连接的另一端意外消失时,在大约75%的情况下,这个线程永远不会意识到另一方已经消失了,任何从缓冲读取器读取的尝试都只会产生一个" null& #34;字符串,但没有抛出异常,我无法关闭该线程,因为它不知道对方已经消失了。在大约25%的情况下,线程被终止(也没有产生异常)但是产生了期望的结果,我只需要线程在TCP连接断开时消失。

我尝试使用它来确定连接是否存活:

boolean connected = socket.isConnected() && !socket.isClosed();

但是这不起作用,当对方离开并且线程继续咀嚼时,总是返回true。

任何想法?

1 个答案:

答案 0 :(得分:2)

重点是:“按设计工作”。

读者返回null实际上意味着:“没有更多的数据;我在这里完成了。”

请参阅javadoc

返回:包含行内容的字符串,不包括任何行终止字符;如果已到达流末尾,则返回null

换句话说:套接字关闭在这里被视为“正常”操作;因此也不例外。换句话说:您必须更改代码以检查readLine()的结果是否返回null;如果是这样,你就知道套接字已经消失了。