2012-03-26 94 views
2

我在两台计算机之间有长期的TCP连接(第二次不在我的控制之下)。第二台电脑可以随时发送FIN标志,首先必须关闭连接电缆(将FIN标志发送回第二台电脑)。如何在java应用程序中检测FIN-tcp标志?

如何知道第二台计算机发送FIN标志,以及何时必须导致Java应用程序的socket.close()方法?

回答

2

通常情况下,您必须读取连接,并在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(); 
} 
+0

你能举个小例子吗? – Divers 2012-03-26 08:14:13

+0

没有什么不可思议的,你只需要阅读一个连接,看看它是否还好。 – 2012-03-26 08:18:17

1

检测接近软连接由对方(当他们设法发送FIN/RST标志)只与旧的Java I/O库部分可能。您只会通过超时了解到连接断开,因此可能远离即时。你的线程可能会挂起很长时间,然后才意识到另一端的派对已经走了。

为了更好地处理它,您需要使用nio。在那里,Selector将会识别出这种情况,表示有数据准备好读取,但随后读取返回小于零的信道。这将允许您几乎立即了解软连接重置。另一方面,只有通过超时才能检测到硬连接终止(例如切断电线或网络的人员),无论您使用哪个库,因为它是TCP协议本身的属性。

相关问题