当ConnectTimeout和ReadTimeout是无限时,SocketTimeoutException?

时间:2012-05-08 04:06:47

标签: java android httpurlconnection socket-timeout-exception

  

可能重复:
  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。
  • 有没有办法设置套接字超时?怎么样?

以下是我的代码片段:

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

}

2 个答案:

答案 0 :(得分:3)

  

为什么当我的连接和读取超时设置为无限时,我的套接字会如此早地超时?

代码请。

  

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

SocketTimeoutException是读取超时。

  

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

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

  

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

HttpURLConnection.setReadTimeout().

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

答案 1 :(得分:0)

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

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

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

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