Android HttpURLConnection连接超时

时间:2014-10-03 09:13:16

标签: android networking httpurlconnection

我在Android 4.1.2和4.2.2中出现间歇性连接问题,因此HTTP堆栈似乎完全超时(DNS查找和TCP / IP仍然有效,我可以使用ADB SHELL检查)。

这些连接通过GPRS进行故障,而不是通过WiFi进行故障。

当使用SHELL检查netstat时,我可以看到连接在SYN_SENT处等待,并且在检查服务器上的防火墙时,我们可以看到它已响应SYN请求但是没有从设备中听到任何回复。在此中断期间,似乎所有HTTP流量都在设备上失败。 Exchange不再有效,您无法使用任何常见浏览器(Firefox,Chrome)请求任何页面,即使设备报告网络并且您可以拨打/接听电话。

我的应用程序通过HTTP和HTTPS进行通信,在此停机期间都失败了。 POST和GET到我的JSON Web服务,请求挂起并抛出:

java.net.SocketTimeoutException: failed to connect to mywebaddress.com/1.1.1.1 (port 443) after 10000ms

如果它在连接时遇到问题,这是预期的,因为它尊重我在HttpURLConnection下面设置的超时。

我使用的代码如下,位于Async类中。这通常包含在连接循环中,具体取决于消息的重要性。这可以被调用最多3次,每次通话之间有15秒的间隙。

HttpURLConnection conn = null;
BufferedReader reader = null;

try
{           
    // Uses ConnectivityManager.getActiveNetworkInfo()
    // Returns true, the Android OS reports a connection
    if(myApp.hasNetworkConnection)
    {
        conn = (HttpURLConnection)endpoint.openConnection();
        conn.setConnectTimeout(10000);
        conn.setReadTimeout(20000);

        reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        StringBuffer strResults = new StringBuffer();
        String strLine = "";

        while ((strLine = reader.readLine()) != null) 
        {
            strResults.append(strLine);
        }

        log(strResults.toString());
    }

}
catch(Exception ex)
{
    log(ex.getMessage());
}
finally
{
    if(reader != null)
        try
        {
            reader.Close();
            reader = null;
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }

    if(connection != null)
    {
        connection.disconnect();
        connection = null;
    }
}

我想知道过去是否有人经历过这种情况,是否经常尝试连接错误方法并耗尽连接池的方法?

创建的连接会定期触发,并且(当前)不会批量连接在一起。

只是为了分享更多信息,这就是netstat在我们遇到停机时在设备(ADB Shell)上显示的内容。两个“ESTABLISHED”连接是TCP连接而不是HTTP请求。移动设备有信号,数据符号显示连接。

SYN_SENT

2 个答案:

答案 0 :(得分:0)

try this

  try {
   HttpURLConnection.setFollowRedirects(false);
   HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
   con.setRequestMethod("HEAD");

   con.setConnectTimeout(5000); //set timeout to 5 seconds

   return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
} catch (java.net.SocketTimeoutException e) {
   return false;
} catch (java.io.IOException e) {
   return false;
}

答案 1 :(得分:0)

以为我会更新,以防其他人遇到此问题。

这里的问题不是Android,而是应用程序正在调用的Web服务。看一下它,当它调用JSON Web服务时,它的响应时间远远超过预期(最多一分钟)以返回响应(如果有的话)并且响应总是200 / OK。

当我们通过请求使Android HTTP Stack饱和时,最终它们没有在足够长的时间内清除并冻结设备。

通过将连接和读取超时设置为更合适的值而不是" 0"我为代码添加了更好的容错能力。 (无限)我们已经看过修改Web服务,以便长时间运行的进程返回201 / Accepted状态,以便设备可以继续进行自己的工作。一旦服务器处理完成,我们就会通过其他方式(Google Cloud Message)回拨设备。