Java 从套接字创建BufferedReader时,如果连接失败,readLine()==null吗?

Java 从套接字创建BufferedReader时,如果连接失败,readLine()==null吗?,java,sockets,Java,Sockets,这个问题类似于,但并不完全相同 如果我有 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); while ((inputLine = bufferedReader.readLine()) != null) {.... 而套接字的连接失败,我会得到一个空读取还是bufferedReader只是挂起等待输入?我的while循环包含在try/catch

这个问题类似于,但并不完全相同

如果我有

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

while ((inputLine = bufferedReader.readLine()) != null) {....
而套接字的连接失败,我会得到一个空读取还是bufferedReader只是挂起等待输入?我的while循环包含在try/catch/finally中,但它似乎从未到达finally


根据我的研究,似乎处理这种情况的唯一方法是创建心跳过程。正确吗?

如果连接失败,将抛出IOException的子类。返回null的唯一方法是套接字关闭,这可能是因为您的程序关闭了它,也可能是因为另一端关闭了它。只有当对等方正确关闭连接时,才会返回null。如果连接失败,在
readLine()
中除了无限块之外,您可能什么也得不到。要检测TCP中的连接故障,您需要已写入连接。读取超时可能是您正在寻找的。如果您自己关闭套接字,您将得到一个
SocketException:socketclosed
@VGR您的意思是如果套接字出现故障?如果不使用心跳机制,有没有办法真正知道两个套接字之间的连接是否失败?我说的是真的。没有“套接字失败”这样的事情。Only connection failures.RE:user207421的注释,SO_KEEPALIVE进程(请参阅)或操作系统可以“神奇地关闭”套接字。如果对等主机崩溃,SO_KEEPALIVE进程将关闭套接字