坑了我几天的http send request死锁

不知道哪家渠道或者广告主,可能使用deepsync返回了一个 itms-appss://这样的地址,最终导致广告追踪服务全部卡住。

最后 kill -3 JVM_PID 查看到 worker thread 是 runnable 但是一直在 socketread状态,最终通过stack trace看到卡在了GET同步。为何? GET同步卡死了——一直没有没有过期超时!

最终测试发现必须如下明显地去设置超时时间,否则遇到有的url就是死路一条:

urlCon.setConnectTimeout(30000);

urlCon.setReadTimeout(30000);

比如 错误的域名会报错,但是给个http://1.1.1.1,必会发现GET同步卡死了(哪怕超时了,也是在你已经要绝望了的时候,两分钟以上都是常见,个人猜测是否跟系统socket超时设置有关)。

-------------------------------------------------------------------------------------

解决HttpURLConnection setConnectTimeout超时无响应的问题

使用getResponseCode()方法超时了却阻塞了线程,原因是指设置了setConnectTimeout没有设置setReadTimeout参数导致的

setConnectTimeout:设置连接主机超时(单位:毫秒)

setReadTimeout:设置从主机读取数据超时(单位:毫秒)

例如:

HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();

urlCon.setConnectTimeout(30000);

urlCon.setReadTimeout(30000);

-------------------------------------------------------------------------------------

System.setProperty(“sun.net.client.defaultConnectTimeout”, “30000″);

System.setProperty(“sun.net.client.defaultReadTimeout”, “30000″);

JDK 1.5以前的版本,只能通过设置这两个系统属性来控制网络超时。在1.5中,还可以使用HttpURLConnection的父类URLConnection的以下两个方法:

setConnectTimeout:设置连接主机超时(单位:毫秒)

setReadTimeout:设置从主机读取数据超时(单位:毫秒)

例如:

HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();

urlCon.setConnectTimeout(30000);

urlCon.setReadTimeout(30000);

-------------------------------------------------------------------------------------

httpConn =  (HttpURLConnection) url.openConnection();

//A URL connection can be used for input and/or output. Set the

//DoInput flag to true if you intend to use the URL connection for input,

//false if not. The default is true.

//URL连接可用于input或output。如果想用URL连接输入,设置DoInput标签为true。

//输入和输出是针对计算机的,如果以程序员的角度考虑,经常弄混。

//input输入,output输出,那么不是从output里read,input中write吗,其实相反

//input输入进计算机,计算机才能读,所以是从input read,而output是计算机输出,通过output write。

httpConn.setDoOutput(false);

//所以如果setDoInput(false),想从URLConnection读取时不能读取

//Cannot read from URLConnection if doInput=false (call setDoInput(true))

httpConn.setDoInput(true);

//连接建立超时时间还有读取数据超时时间,

httpConn.setConnectTimeout(600000);

httpConn.setReadTimeout(600000);

httpConn.setRequestMethod("GET");

httpConn.connect();

//获取状态码

intcode = httpConn.getResponseCode();

System.out.println(code);

//读http请求响应

BufferedReader reader =newBufferedReader(newInputStreamReader(httpConn.getInputStream()));

String line;

while((line = reader.readLine()) !=null)

{

result = result + line+"\n";

}

System.out.println(result);

//关闭IO和连接

reader.close();

httpConn.disconnect();

参考:http://blog.csdn.net/iaiti/article/details/52036947

-------------------------------------------------------------------------------------

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 Servlet&网络访问 1.1网路基础 B/S的S Serverhttp网络应用服务端软件 httpHy...
    征程_Journey阅读 4,035评论 0 1
  • 有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了。 Ja...
    java菜阅读 5,422评论 0 1
  • 这节课是 Android 开发(入门)课程 的第三部分《访问网络》的第二节课,导师是 Chris Lei 和 Jo...
    HsuJin阅读 4,662评论 0 10
  • // com.adobe.flash.listen settings.gradle 定义项目包含那些模块app.i...
    zeromemcpy阅读 5,592评论 0 1
  • 清平乐 庆生 九月十八,小生日妈妈。还是陆季相媚好,一桌蛋糕佳肴。军儿视频帝都,军嫂忙着照顾。最喜亲家夫妇,举杯红...
    步鹿狐阅读 1,755评论 2 4