【问题标题】:SocketTimeoutException when ConnectTimeout and ReadTimeout is infinite? [duplicate]ConnectTimeout 和 ReadTimeout 无限时出现 SocketTimeoutException? [复制]
【发布时间】:2012-05-08 04:06:47
【问题描述】:

可能重复:
Receiving request timeout even though connect timeout and read timeout is set to default (infinite)?

我尝试连接到网络服务并在大约 20 秒后收到SocketTimeoutException。托管 Web 服务的 Tomcat 服务器已关闭,因此预计会出现 Exception。但是,我没有设置 ConnectTimeout 和 ReadTimeout 的值。根据文档,这两个的默认值是无限的。

这种情况的一种可能性是我尝试连接的服务器有自己的超时。但是当我的朋友尝试使用 iOS 连接到它时,他的连接在大约 1 分 15 秒后超时。如果服务器是发出超时的服务器,那么我们的连接应该几乎同时超时。请注意,他也在使用 iOS 的默认超时时间。

  • 当我的连接和读取超时设置为无限时,为什么我的套接字这么早就超时了?
  • 套接字超时与连接和读取超时是否不同?如果有,有什么不同?
  • 如何知道我的套接字超时值?我正在使用 HttpURLConnection。
  • 有没有办法设置套接字超时?怎么样?

下面是我的代码的 sn-p:

httpURLConnection = (HttpURLConnection) ((new URL("http://www.website.com/webservice")).openConnection());
httpURLConnection.setDoInput(isDoInput);
httpURLConnection.setDoOutput(isDoOutput);
httpURLConnection.setRequestMethod(method);

try
{
    OutputStreamWriter writer = new OutputStreamWriter(httpURLConnection.getOutputStream());
    writer.write("param1=value1");
    writer.flush;
}catch(Exception e)
{

}

【问题讨论】:

  • 你为什么要重新问一个你已经回答过的问题?
  • @Krroae27:感谢您提及。我很抱歉。我暂时停止处理这个问题来做不同的任务。我忘了我之前已经发布过类似的问题了。
  • @EJP:我忘记了我之前的帖子。另外,我对上一篇文章的答案不满意。我正在尝试删除这篇文章,但我不能删除,因为已经有答案了。
  • @Arci 您上一篇文章中的答案与这篇文章中的答案相同。

标签: java android httpurlconnection socket-timeout-exception


【解决方案1】:

当我的连接和读取超时设置为无限时,为什么我的套接字这么早就超时了?

请输入代码。

套接字超时与连接和读取超时是否不同?如果有,有什么不同?

SocketTimeoutException 是读取超时。

如何知道我的套接字超时值?我正在使用 HttpURLConnection。

HttpURLConnection.getReadTimeout();还有HttpURLConnection.getConnectTimeout()

有没有办法设置套接字超时?怎么样?

HttpURLConnection.setReadTimeout().

您已经在original post 中引用了所有这些方法。你为什么在这里问他们?

【讨论】:

  • 谢谢!我已经更新了我的问题以包含我的代码的 sn-p。正如我之前所说,我忘记了我原来的帖子。我试图删除这篇文章,但我不能,因为已经有了答案。无论如何,我的 readTimeout 使用的是无限的默认值。我还使用 getReadTimeout 进行了检查,值为 0。
【解决方案2】:

终于,我找到了导致我超时的原因!事实证明,确实是服务器导致了我的超时。一开始我对此表示怀疑,因为我在使用 iOS 时收到了超过 1 分钟的不同超时。

所以这里是: 持有我的 Tomcat 服务器的操作系统是 Windows。 Windows 未应答连接的默认重试次数为 2。因此,当您第一次尝试连接失败时,您仍有 2 次重试。重试都是在内部完成的。我不确定每次重试的时间是如何计算的,但基本上是 3 + 6 + 12 = 21 秒。

  • 第一次重试 = 3 秒
  • 第二次重试 = 6 秒
  • 第三次重试 = 12 秒

第三次重试后,您的连接将被切断。另外,到那个时候,你已经等了 21 秒了。

【讨论】:

  • (1) Windows 不会导致此问题。您描述了连接时的 Windows 行为。您的问题是关于 Android 在连接时的行为。 (2) 如果您在尝试连接时收到SocketTimeoutException,那是Android 平台中的错误。它应该抛出一个ConnectException,并显示消息“连接超时”。正如 Javadoc 中所说,SocketTimeoutException 仅用于读取和接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 2020-07-26
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 2021-01-11
相关资源
最近更新 更多