我在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请求。移动设备有信号,数据符号显示连接。
答案 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)回拨设备。