Java 无法检测到插座关闭?inputStream.read为SocketTimeoutException提供了一种很好的方法,是否尝试在inputStream.read之后再次重新连接?

Java 无法检测到插座关闭?inputStream.read为SocketTimeoutException提供了一种很好的方法,是否尝试在inputStream.read之后再次重新连接?,java,sockets,network-programming,inputstream,socket-timeout-exception,Java,Sockets,Network Programming,Inputstream,Socket Timeout Exception,无法检测到插座关闭。使用inputStream读取时未接收-1。我正在考虑在SocketTimeoutException发生时断开连接,并尝试再次连接套接字。这有多可行 socket.setSoTimeout(100); InputStream dis = socket.getInputStream(); int count =0; try { LogManager.logInfo("Inside read thread before reading"); count = dis.read(bu

无法检测到插座关闭。使用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
}
无法检测到插座关闭

您尚未关闭套接字,因此没有任何可检测的内容。毫无疑问,您的意思是“无法检测到连接关闭”,这是由
read()。我在这里没有看到任何测试这个的代码

使用inputStream读取时未接收-1

如果套接字关闭,您将获得
SocketException:socketclosed
。如果连接已关闭,则会出现上述行为

我正在考虑在出现
SocketTimeoutException

不存在“SocketTimeoutException发生时断开连接”的情况

并尝试再次连接插座

无法重新连接TCP套接字。必须关闭当前文件并创建新文件

这有多可行

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
}
一点也不

// not receiving -1 in case of socket close
见上文“插座关闭”。如果您没有从
read()
接收到-1,那是因为没有连接套接字关闭

当您收到一个
SocketTimeoutException
时,套接字和连接都没有关闭,并且没有关闭它们的特定原因。这意味着在您指定的超时时间内没有来自对等方的数据。可能超时时间太短;可能是同伴行为不端。根据应用程序协议、预期服务时间、网络延迟等,由您的应用程序决定哪一项

100毫秒对于读取超时来说简直是太短了。应以秒或数十秒为单位进行测量

无法检测到插座关闭

您尚未关闭套接字,因此没有任何可检测的内容。毫无疑问,您的意思是“无法检测到连接关闭”,这是由
read()。我在这里没有看到任何测试这个的代码

使用inputStream读取时未接收-1

如果套接字关闭,您将获得
SocketException:socketclosed
。如果连接已关闭,则会出现上述行为

我正在考虑在出现
SocketTimeoutException

不存在“SocketTimeoutException发生时断开连接”的情况

并尝试再次连接插座

无法重新连接TCP套接字。必须关闭当前文件并创建新文件

这有多可行

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
}
一点也不

// not receiving -1 in case of socket close
见上文“插座关闭”。如果您没有从
read()
接收到-1,那是因为没有连接套接字关闭

当您收到一个
SocketTimeoutException
时,套接字和连接都没有关闭,并且没有关闭它们的特定原因。这意味着在您指定的超时时间内没有来自对等方的数据。可能超时时间太短;可能是同伴行为不端。根据应用程序协议、预期服务时间、网络延迟等,由您的应用程序决定哪一项


100毫秒对于读取超时来说简直是太短了。它应该以秒或几十秒来衡量。

@你似乎很困惑。这是一个正确的答案。如果你想投票不正确,我有一些不正确的答案,你可以投票。是的,我的意思是检测连接关闭而不是套接字关闭,很抱歉,对于inputStream.read(),我没有得到-1,如果我尝试在连接关闭时重新连接,它不会提供到主机的路由。那么,有没有什么方法可以在不重新连接套接字的情况下检测到连接关闭。如果您没有得到-1,则连接尚未关闭。它可能失败了,您可能希望将超时作为这一点的证据(但超时时间要比100ms长得多)。“没有到主机的路由”这一事实表明网络出现了相当严重的问题,您似乎感到困惑。这是一个正确的答案。如果你想投票不正确,我有一些不正确的答案,你可以投票。是的,我的意思是检测连接关闭而不是套接字关闭,很抱歉,对于inputStream.read(),我没有得到-1,如果我尝试在连接关闭时重新连接,它不会提供到主机的路由。那么,有没有什么方法可以在不重新连接套接字的情况下检测到连接关闭。如果您没有得到-1,则连接尚未关闭。它可能失败了,您可能希望将超时作为这一点的证据(但超时时间要比100ms长得多)。“没有到主机的路由”这一事实表明网络出现了相当严重的问题。您的代码显示的问题甚至比明显的问题还要多。在您的情况下,流似乎被阻塞,因此至少有一方应该
flush()
channel或刷新它。在您的例子中,想象一个简单的场景,您在读取流时得到了
SocketTimeoutException
,因为另一端确实停机(在调用
socket.connect()之后)
。您需要处理大量可能的错误。另外,请仔细查看您的代码,发现的问题甚至比明显的问题更多。在您的情况下,流似乎被阻塞,因此至少有一方应该刷新频道或刷新频道。在您的情况下,想象一个简单的场景