2012-09-02 77 views
1

我想区分服务器连接关闭的客户端套接字的例外,就好像服务器套接字由于空闲超时而关闭,原因必须在客户端生成为空闲超时异常。与连接失败异常等类似,连接失败也是如此。请帮我解决这个问题。提前致谢。如何区分服务器套接字连接在客户端套接字上关闭的异常?

+1

请参阅http://stackoverflow.com/questions/151590/java-how-to-detect-a-remote-side-socket-close&http://stackoverflow.com/questions/155243/why-is- it-impossible-without-attempting-io-to-detect-that-tcp-socket-was-grac – Zaki

回答

1

如果服务器正确地关闭了套接字,那么在客户端只有一个可能的异常,而不是客户端必须捕捉并找出的一系列不同的异常。只有一个EOS指示:read()返回-1,readLine()返回null,readXXX()为任何其他X引发EOFException。

如果由于网络故障导致连接中断,客户端通过文本“连接重置”来获得IOException。如果连接保持运行但服务器没有发送数据,并且客户端有读取超时,则客户端将收到SocketTimeoutException。这些都不意味着服务器已经关闭了连接(尽管服务器可能导致连接重置,我不会在这里文档化)。

如果您需要知道服务器为什么关闭了套接字,它将不得不通过消息告诉您。

+0

感谢兄弟为您解答。通过使用哪种方法,我们可以发送消息从服务器到客户端请让我没有... – Rocky

+0

@Rocky您发送任何其他消息相同的方法。你目前如何发送消息? –

+0

我正在使用session.write方法发送数据。在服务器空闲的情况下,conn超时如果我们发送消息给客户端,那么超时方法将不会被执行,因为它们之间会有一些数据流。所以超时方法从第一次开始,并且空闲连接超时从未发生。感谢彼得的帮助和支持 – Rocky

1

最好的方法是让服务器向您发送一条消息,说明为什么它关闭了连接。服务器不会关闭默认情况下闲置的连接。

+0

感谢Peter的回答。请给我提供一个例子或方法来说明如何做到这一点。 – Rocky

+0

你如何做到这一点取决于你的协议。假设你有一个发送消息类型和消息长度的协议,你可以添加一个类型,这意味着DISCONNECTED_DUE_TO_IDLE_TIMEOUT,并在正文中包含一条文本消息。 –

+0

我使用apache mina框架为服务器客户端。那么我应该使用哪种协议。请告诉我如何使用该协议语法。在此先感谢 – Rocky

相关问题