0

可能重复:
即使连接超时和读取超时设置为默认值(无限),仍接收请求超时?

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

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

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

下面是我的代码片段:

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)
{

}
4

2 回答 2

3

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

请代码。

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

SocketTimeoutException是读取超时。

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

HttpURLConnection.getReadTimeout(); 也HttpURLConnection.getConnectTimeout()

有没有办法设置套接字超时?如何?

HttpURLConnection.setReadTimeout().

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

于 2012-05-08T04:16:04.483 回答
0

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

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

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

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

于 2012-05-08T08:14:18.353 回答