Android通过HttpConnectionParams类为http参数设置提供了两个超时的设置选项,分别是setSoTimeout和setConnectionTimeout。初看一眼Android官方给的文档对这个两个方法的具体含义有一种不理解不够清楚的感觉,所以决定通过测试的方式来看看到底在什么情况下这两个参数会起作用。

经过测试可以发现,setConnectionTimeout设置了建立连接的超时,这是针对TCP的三次握手而言的,如果在指定时间内无法和http服务器建立TCP连接,就会抛出ConnectionTimeoutException。setSoTimeout则设置的是TCP保活时间,在建立了连接之后的指定时间内没有收到服务器发来的相应的数据包,则抛出SocketTimeoutException.

一、测试代码

 
        private String urlString;        private int timeout1,timeout2;        MyAsyncTask(String url,int timeout1,int timeout2){            urlString=url;            this.timeout1=timeout1;            this.timeout2=timeout2;        }        @Override        protected String doInBackground(String... params) {            httpget(urlString,timeout1,timeout2);            return "test";        }    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        new MyAsyncTask("http://www.xiaonei.com:1234",3000,5000).execute("start");        new MyAsyncTask("http://www.baidu.com",3000,5000).execute("start");            }    private void httpget(String Url,int timeout1,int timeout2) {        Log.v("httpget", "httpget start timeout1 is "+timeout1+"timeout2 is "+timeout2);        int timeoutConnection = timeout1; // until connection is established        int timeoutSocket = timeout2; // timeout for waiting for data        HttpParams httpParameters = new BasicHttpParams();        HttpConnectionParams.setConnectionTimeout(httpParameters,                timeoutConnection);        HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);        HttpGet postRequest = new HttpGet(Url);            HttpResponse httpResp = null;            try {            httpResp = httpClient.execute(postRequest);        } catch (ClientProtocolException e) {            Log.v("Main", "clinet protocol exception");            return;        }catch (SocketTimeoutException e) {            // TODO: handle exception            Log.v("Main", "socket timeout"+timeout2);            return;        }catch (ConnectTimeoutException e) {            // TODO: handle exception            Log.v("Main", "connection timeout"+timeout1);            return;        }        catch (IOException e) {            Log.v("Main", "io exception");            return;        }        }

二、setConnectionTimeout测试

在httpget的url中写入一个无法进行通信的地址如“10.1.1.1”或者是一个公开服务器没有开放的端口号如“www.xiaonei.com:1234”都会出现ConnnectionTimeoutException.对于一个无法通信的IP地址,Android系统直接构造一个发送至改地址的TCP建立连接数据包,不过由于该地址不存在,所以不会收到确认,到了设定好的超时时间就发生超时事件。对于不存在端口号的情况基本类似。

三、setSoTimeout测试

setSoTimeout设置了socket的保活超时时间。这里的测试方法是通过给Android终端设置代理,在代理收到了Android终端发来的http请求之后,直接截获http请求不予发送,到了超时时间抛出socketTimeoutException.这样一种http数据包截获的方式可以通过fiddler方便地实现。利用fiddler代理功能进行Androidhttp抓包配置方法见http://www.oschina.net/question/221817_129716,fiddler拦截数据包的方法见http://www.mzwu.com/article.asp?id=3509。

配置了fiddler代理并对http包进行拦截之后,运行测试程序可以得到如下输出。两个http请求都输出了socket timeout。第一个请求之所以也输出了socket timeout,是因为Android终端和代理之间能够正常建立连接,所以不会出现connection timeout,但是代理转交了Android终端发来的http请求之后无法获得响应,也就无法将相应的信息反馈给客户端,客户端出现了socket timeout。

四、AsyncTask的进一步理解

从以上测试结果中可以看出,虽然在oncreate函数中同时调用了AsyncTask类分别发送两个不同的http请求,但是第二个被调用的Asyntask需要等到第一个被调用的超时之后才能被执行。这是因为Android在3.0之后,AsyncTask的实现上将所有的Asynctask都放到了一个线程中,按照一定的顺序有先后的执行。更详细的分析可以参考http://blog.csdn.net/singwhatiwanna/article/details/17596225。

五、参考材料

[1]关于http超时参数的解释:http://stackoverflow.com/a/18185568/1767800

[2]关于如何得到http连接超时:http://stackoverflow.com/questions/100841/artificially-create-a-connection-timeout-error

更多相关文章

  1. Android自动化测试工具——Monkey
  2. android 测试必备 -adb 工具的使用
  3. Ubuntu 10.04 编译Android(安卓)2.1源码
  4. Android自动化测试之Monkey工具
  5. [Android] 基于 Linux 命令行构建 Android(安卓)应用(五):Ant 构建
  6. Instrumentation 框架简介
  7. 在Ubuntu(Linux)上安装Android(安卓)Studio
  8. android读写文件函数代码
  9. Android(安卓)CTS 兼容性测试的Fail的一些修改

随机推荐

  1. 数据结构简明备忘录 线性表
  2. SQL对冗余数据的删除重复记录只保留单条
  3. 一次SQL调优数据库性能问题后的过程(300W
  4. 根据日期知道当天是星期几的手动计算方法
  5. SQLServer 附加数据库后出现只读或失败的
  6. SQL 合并多行记录的相同字段值
  7. MSSQL Server 查询优化方法 整理
  8. mysql 数据库中索引原理分析说明
  9. SQL批量插入数据几种方案的性能详细对比
  10. SQL数据库的高级sql注入的一些知识