【问题标题】:Not able to detect socket close? is trying to reconnect again after inputStream.read gives SocketTimeoutException a good way?无法检测到套接字关闭?在 inputStream.read 给 SocketTimeoutException 一个好方法之后尝试重新连接?
【发布时间】:2018-07-12 16:33:33
【问题描述】:

无法检测到套接字关闭。使用 inputStream 读取时未收到 -1。我正在考虑在发生 SocketTimeoutException 的情况下断开连接并尝试再次连接套接字。这有多可行?

socket.setSoTimeout(100);
InputStream dis = socket.getInputStream();
int count =0;
try {
LogManager.logInfo("Inside read thread before reading");
count = dis.read(buffer);  // not receiving -1 in case of socket close
} catch (SocketTimeoutException e) {
LogManager.logError("Socket timedout",e);
// should i try to reconnect to socket here
}

【问题讨论】:

  • 你的代码比显而易见的问题提出了更多的问题。在您的情况下,似乎流被卡住了,因此至少一侧应该flush() 频道或刷新它。在你的情况下,想象一个简单的场景,你在读取流时得到SocketTimeoutException,导致另一端真的关闭(在调用socket.connect()之后。你需要处理大量可能的错误。也采取看看java NIO

标签: java sockets network-programming inputstream socket-timeout-exception


【解决方案1】:

无法检测到套接字关闭。

你还没有关闭套接字,所以没有什么可以检测到的。毫无疑问,您的意思是“无法检测到 connection close”,这是由 read() 返回 -1、readLine() 返回 null 或 readXXX() 抛出 EOFException 来表示的XXX。我在这里没有看到任何测试这个的代码。

使用 inputStream 读取时未收到 -1。

如果 socket 已关闭,您将获得SocketException: socket closed。如果 连接 被关闭,您将获得上述行为。

我正在考虑在SocketTimeoutException的情况下断开连接

没有'在SocketTimeoutException 的情况下断开连接'。

并尝试再次连接套接字。

您无法重新连接 TCP 套接字。您必须关闭当前的并创建一个新的。

这有多可行?

一点也不。

// not receiving -1 in case of socket close

请参阅上面的“套接字关闭”。如果您没有收到来自read() 的 -1,那是因为 is 没有 connection 套接字关闭。

当您收到SocketTimeoutException 时,套接字没有关闭,连接也没有关闭,也没有特别的理由关闭它们。这意味着在您指定的超时时间内没有数据从对等方到达。可能超时时间太短;可能同行行为不端。由您的应用程序根据应用程序协议、预期的服务时间、网络延迟等来决定哪个...

而且 100 毫秒对于读取超时来说太短了。应该以秒或几十秒为单位。

【讨论】:

  • @downvoter 你似乎很困惑。这是一个正确的答案。如果你想投错票,我有一些你可以投票的错误答案。
  • 是的,我的意思是检测连接关闭而不是套接字关闭,很抱歉,在 inputStream.read() 的情况下我没有得到-1,如果我在连接时尝试重新连接关闭它没有给主机的路线。那么有什么方法可以在不尝试重新连接套接字的情况下检测到连接关闭。
  • 如果您没有得到 -1,则连接尚未关闭。它可能失败了,,您可能希望将超时作为证据(但超时时间要长于 100 毫秒)。您得到“没有到主机的路由”这一事实表明网络出现了非常严重的问题。
猜你喜欢
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2012-03-01
  • 2010-09-05
  • 2021-05-01
  • 2013-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多