我在两台计算机之间有长期的TCP连接(第二次不在我的控制之下)。第二台电脑可以随时发送FIN标志,首先必须关闭连接电缆(将FIN标志发送回第二台电脑)。如何在java应用程序中检测FIN-tcp标志?
如何知道第二台计算机发送FIN标志,以及何时必须导致Java应用程序的socket.close()方法?
我在两台计算机之间有长期的TCP连接(第二次不在我的控制之下)。第二台电脑可以随时发送FIN标志,首先必须关闭连接电缆(将FIN标志发送回第二台电脑)。如何在java应用程序中检测FIN-tcp标志?
如何知道第二台计算机发送FIN标志,以及何时必须导致Java应用程序的socket.close()方法?
通常情况下,您必须读取连接,并在EOF返回-1或适当的IOException时,可以关闭连接。注意:SocketTimeoutException并不意味着连接已关闭。
一个例子。
boolean ok = false;
try {
int b = in.read();
ok = b >= 0;
if (!ok)
throw new EOFException();
} finally {
if (!ok)
in.close();
}
检测接近软连接由对方(当他们设法发送FIN/RST标志)只与旧的Java I/O库部分可能。您只会通过超时了解到连接断开,因此可能远离即时。你的线程可能会挂起很长时间,然后才意识到另一端的派对已经走了。
为了更好地处理它,您需要使用nio
。在那里,Selector
将会识别出这种情况,表示有数据准备好读取,但随后读取返回小于零的信道。这将允许您几乎立即了解软连接重置。另一方面,只有通过超时才能检测到硬连接终止(例如切断电线或网络的人员),无论您使用哪个库,因为它是TCP协议本身的属性。
你能举个小例子吗? – Divers 2012-03-26 08:14:13
没有什么不可思议的,你只需要阅读一个连接,看看它是否还好。 – 2012-03-26 08:18:17