【问题标题】:How can we differetiate the exceptions for server socket connection close on a client socket?我们如何区分客户端套接字上服务器套接字连接关闭的异常?
【发布时间】:2012-09-02 15:40:00
【问题描述】:

我想区分客户端套接字上服务器连接关闭的异常,例如服务器套接字是否由于空闲超时而关闭,该原因必须在客户端生成为空闲超时异常。同样对于连接失败如连接失败异常等等。请帮我解决这个问题。提前致谢。

【问题讨论】:

标签: java sockets


【解决方案1】:

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

如果连接因网络故障而断开,客户端可能会收到带有文本“连接重置”的 IOException。如果连接保持正常但服务器没有发送数据并且客户端有读取超时,客户端将收到 SocketTimeoutException。这些都不意味着服务器已经关闭了连接(尽管服务器可能会导致连接重置,我不会在这里记录)。

如果您需要知道服务器关闭套接字的原因,它必须通过消息告诉您。

【讨论】:

  • 谢谢老兄的回答。通过使用哪种方法我们可以将消息从服​​务器发送到客户端,请不要让我这样......
  • @Rocky 发送任何其他消息的方法相同。您目前如何发送消息?
  • 我正在使用 session.write 方法发送数据。在服务器空闲连接超时,如果我们向客户端发送任何消息,那么超时方法将不会被执行,因为它们之间会有一些数据流。所以超时方法从第一个开始,空闲连接超时永远不会发生。感谢彼得的帮助和支持
【解决方案2】:

最好的方法是让服务器向您发送一条消息,说明它关闭连接的原因。服务器不会关闭默认处于空闲状态的连接。

【讨论】:

  • 感谢彼得的回答。请给我一个例子或方法如何做到这一点。
  • 如何执行此操作取决于您的协议。假设您有一个发送消息类型和消息长度的协议,您可以添加一个表示 DISCONNECTED_DUE_TO_IDLE_TIMEOUT 的类型并在正文中包含一条文本消息。
  • 我正在为服务器客户端使用 apache mina 框架。那么我应该使用哪种协议。请告诉我如何使用该协议语法。提前致谢
  • 你可以在 Mina 中使用任何协议,它只是一个传输。您目前有协议吗?你用这些连接做什么?
  • 感谢彼得的所有帮助。我清楚地理解了这个概念
猜你喜欢
  • 2013-02-17
  • 1970-01-01
  • 2017-02-25
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-12-09
  • 1970-01-01
  • 2021-03-31
相关资源
最近更新 更多