我连接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。
任何想法?
答案 0 :(得分:2)
重点是:“按设计工作”。
读者返回null实际上意味着:“没有更多的数据;我在这里完成了。”
请参阅javadoc:
返回:包含行内容的字符串,不包括任何行终止字符;如果已到达流末尾,则返回null
换句话说:套接字关闭在这里被视为“正常”操作;因此也不例外。换句话说:您必须更改代码以检查readLine()
的结果是否返回null;如果是这样,你就知道套接字已经消失了。