可能重复:
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) ((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)
{
}
答案 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次重试后,您的连接将被切断。此时,到那时,你已经等了21秒。