【发布时间】:2017-05-11 11:52:08
【问题描述】:
我正在连接一个 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% 的情况下,该线程从未意识到另一端已经消失,并且任何从缓冲读取器读取的尝试都将简单地产生一个“空”字符串,但没有抛出异常,我无法关闭线程,因为它不知道对方已经离开。在大约 25% 的情况下,线程会被终止(也不会产生异常),但这会产生预期的结果,我只需要在 TCP 连接断开时让线程离开。
我尝试使用它来确定连接是否存在:
boolean connected = socket.isConnected() && !socket.isClosed();
但这不起作用,总是在对方离开并且线程继续咀嚼时返回true。
有什么想法吗?
【问题讨论】:
-
定义“消失”。 TCP 连接的工作方式,如果对方关闭了连接,您应该会看到异常。但是,如果对方只是变得无法访问(例如电缆被拉断,或者服务器被关闭,在 TCP 发现有问题之前将有很长的超时时间。
-
Gone away 意味着另一端的程序决定退出。不是崩溃,而是退出。这意味着它关闭了 TCP 连接。当连接断开时,客户端应该会检测到一个事件,不是吗?
-
它在哪里说它应该抛出异常?根据 Javadoc,当
readLine()返回 null 时,您为什么不停止阅读,这意味着“流结束”?这就是您正在寻找的“事件”。 -
另一端 锣不构成“封闭式插座”。它构成一个断开的连接。
标签: java multithreading sockets tcp bufferedreader