gpt4 book ai didi

java - Java中的BufferedReader在尝试从关闭的套接字读取时无法触发异常

转载 作者:行者123 更新时间:2023-12-02 03:09:02 26 4
gpt4 key购买 nike

我正在连接一个 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”字符串,但没有抛出异常,并且我无法关闭线程,因为它不知道另一端已经消失。在大约 25% 的情况下,线程会终止(也不会生成异常),但这会产生所需的结果,我只需要线程在 TCP 连接断开时消失。

我尝试使用它来确定连接是否处于 Activity 状态:

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

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

大家有什么想法吗?

最佳答案

要点基本上是:“按设计工作”。

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

请参阅javadoc :

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

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

关于java - Java中的BufferedReader在尝试从关闭的套接字读取时无法触发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41341004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com