http://note.youdao.com/share/?id=f14d304548003f65e34255d3ddf9df31&type=note
网络编程:Http通信与Socket通信(移动互联核心)
知识点概述:
1.Socket通信:面向连接(TCP)和无连接的(UDP)
2.HttpURLConnection 接口:Get和Post方式
3.HttpClient接口:Get和Post方式
知识点详述:
1 Socket通信
Socket称为”套接字“,用于描述IP地址和端口,它是支持TCP/IP协议的网络通信的基本操作单元。有两种主要的操作方式:面向连接(TCP协议)和无连接(UDP协议)的。面向连接的操作比无连接操作的效率更低,但是数据的安全性更高。
OSI七层模型
TCP与UDP区别:
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务,传输数据前经过“三次握手”建立连接,保证数据传输的可靠性,但效率比较低。一般用于对于数据传输安全性较高的场合。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议,面向无连接。UDP不提供可靠性,数据传输可能发生错序,丢包,但效率较高。一般用于对于实时性要求较高的场合。
Android Socket编程
(1)服务器实现步骤:
指定端口实例化一个ServerSocket 1. 实例化ServerSocket实例,指定端口号
调用ServerSocket的accept()以在等待连接期间造成阻塞 2. 调用accept方法,等待客户端请求
获取位于该底层Socket的流以进行读写操作 3. 有请求则返回Socket连接实例
将数据封装成流 4. 通过Socket获取输入流读取请求数据,并获得输出流做出响应
对Socket进行读写 5.关闭流
关闭打开的流
ServerSocket ss = null;
// 创建一个ServerSocket,监听一个端口号
try {
ss = new ServerSocket(8080);
// 等待一个socket连接
Socket s = ss.accept();
// 缓冲读取数据类
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
// 从流中读取一行数据
String msgFromClient = br.readLine();
System.out.println("msgFromClient:" + msgFromClient);
// 参数2:true 表示数据自动刷新
PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()), true);
pw.println("接受到了!");
//刷新数据
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}
(2)客户端实现步骤:
通过IP地址和端口实例化Socket,请求连接服务器 1.实例化Socket实例,指定服务端ip,以及服务端监听此服务的端口号
获取Socket上的流以进行读写 2. 通过Socket获取输出流向服务端发送消息
把流包装进BufferedReader/PrintWriter的实例 3.再通过Socket获取输入流读取服务端响应数据
对Socket进行读写 4.关闭流
关闭打开的流
Socket s = null;
try {
//和服务器断建立连接
s = new Socket("127.0.0.1", 8080);
//将输出流输出
PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
pw.println("我是客户端,我给你一些数据");
// 刷新提交过去
pw.flush();
//接收客户端的消息
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String msgFromServer = br.readLine();
System.out.println("msgFromServer:" + msgFromServer);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
作业: http://www.cnblogs.com/-run/archive/2011/12/29/2306363.html
前序:HTTP通信 (B/S, C/S)
HTTP(超文本传输协议)用于传送www方式的数据,采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含了请求的方法、URI、协议版本,以及包含请求修饰符、
客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本、成功或者错误编码,还包含服务器信息、实体元信息以及可能的实体内容。它是一个属于应用层的面向对象的协议,由于其简洁、快速,它适用于分布式超媒体信息系统。在internet上,http通信通常发生在TCP/IP连接之上,缺省端口是TCP 80,但其他的端口也是可用的。这并不预示着http协议在internet或其它网络的其他协议之上才能完成,http只预示着一个可靠地传输。Android提供了HttpURLConnection和HttpClient接口来开发http程序。
2.HttpURLConnection 接口 java.net.*提供
HTTP通信中使用最多的就是Get和Post,Get请求可以获取静态页面,也可以把参数放在URL字符串后面,传递给服务器。Post与Get的不同之处在于Post的参数不是放在URL字符串里面,而是放在http请求数据中。HttpURLConnection是Java的标准类,继承自URLConnection类,两个类都是抽象类,无法直接实例化对象。其对象主要通过URL的openConnection方法获得。每次openConnection都将创建一个新的连接实例,在连接之前我们可以对其一些属性进行设置,比如超时时间等:
connection.setDoOutput(true); //设置输入流(Post时必须设置)
connection.setDoInput(true); // 设置输出流(Post时必须设置)
connection.setRequestMethod("POST"); // 设置方式为POST(Post时必须设置)
connection.setInstanceFollowRedirects(true); //设置该请求是否重定向
connection.disconnect(); //关闭HttpURLConnection连接
connection.setConnectionTimeout(int time); //设置连接超时
connection.setReadTimeout(int time); //设置读取超时
注:如果使用post方式,还需要设置请求的Content-Type
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
3. HttpClient接口(Apache接口,包名:org.apache.http.*),需要了解一些类:
HttpClient实现移动互联的步骤,以及需要的类:
1) 封装请求 HttpGet / HttpPost
2) 封装连接参数 HttpParams--》BasicHttpParams, HttpConnectionParams
注:如果是Get方式则省略3)4)步骤
3)封装请求参数 NameValuePair--》BasicNameValuePair--》List<NameValuePair>-->HttpEntity-->UrlEncodedFormEntity
4 ) 设置请求参数 HttpPost-->setEntity(请求参数)
5) 封装执行请求的客户端实例并且设置连接参数 HttpClient--》DefaultHttpClient(HttpParams)
6)发送请求,接收响应 client.execute(HttpGet/HttpPost)--->HttpResponse
7 ) 判断响应码是否是200,如果正常则接收响应数据 resp.getStatusLine().getStatusCode()-->200-->getEntity()-->HttpEntity
8 ) 根据响应数据类型进行转换
(图片--》HttpEntity.getConent()-->InputStream--->BitmapFactory.decodeStream())
(文本--》EntityUtils.toString(HttpEntity, "utf-8")
(1)HttpClient使用Get方式获取数据,需要使用HttpGet来构建一个Get方式的http请求,然后通过HttpClient来执行这个请求,HttpResponse在接收这个请求后给出响应,最后通过“HttpResponse.getStatusLine().getStatusCode()"来判断请求是否成功,并处理。可以直接使用如下方法将响应的实体元信息转化为字符串
String strResult = EntityUtils.toString(httpResponse.getEntity());
HttpClient的Get方式请求步骤:
?封装HttpGet请求 new HttpGet(urlStr)
? 通过HttpParams设置连接参数
?获取HttpClient实例 new DefaultHttpClient();
?发送请求,接收响应
HttpResponse = httpClient.excute(httpGet)
?判断响应码是不是200.如果是200,接收响应数据
HttpEntity = httpResponse.getEntity();
HttpClient使用Post方式获取数据稍微复杂一点。首先好使用HttpPost来构建一个Post方式的http请求,
HttpPost httpRequest=new HttpPost("url");
需要使用NameValuePair来保存要传递的参数,可以使用BasicNameValuePair来构造一个要被传递的参数,然后通过add方法添加这个参数到NameValuePair中,
List<NameValuePair> params=new ArrayList<NameValuePair>(); //使用NameValuePair来保存要传递的Post参数
params.add(new BasicNameValuePair("par","HttpClient_android_Post"));
//添加要传递的参数Post方式还需要设置所使用的字符集,最后就和Get方式一样通过HttpClient来请求这个连接,返回响应并处理,
HttpEntity httpentity=new UrlEncodedFormEntity(params,"utf-8"); //设置字符集
httpRequest.setEntity(httpentity); //为请求设置实体元信息
(2)DefaultHttpClient是默认的一个HTTP客户端,我们可以使用它创建一个HTTP连接。
代码如下:HttpClient hc=new DefaultHttpClient();
(3) HttpResponse是一个HTTP连接响应,当执行一个http连接后,就会返回一个HttpResponse,可以通过其获得一些响应信息。下面是请求一个HTTP连接并获得该请求是否成功的代码:
HttpResponse hresponse=hc.execute(httpRequest);
if(hresponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ //连接成功
}
示例代码:
//HttpClient接口通过Post方式获取数据
private String requestStringGet(String urlStr, String param){
String content = "";
//构建Post请求
HttpPost request = new HttpPost(urlStr);
//构建设置连接参数实例
HttpParams connParams = new BasicHttpParams();
//设置连接超时
HttpConnectionParams.setConnectionTimeout(connParams, 10 * 1000);
//设置Socket超时
HttpConnectionParams.setSoTimeout(connParams, 10 * 1000);
//构建请求参数
List<NameValuePair> requestParams = new ArrayList<NameValuePair>();
requestParams.add(new BasicNameValuePair("name", param));
requestParams.add(new BasicNameValuePair("pass", param));
try{
//将请求参数列表转化为请求实体元信息
HttpEntity paramEntity = new UrlEncodedFormEntity(requestParams,"utf-8");
//将请求实体元信息设置到请求中
request.setEntity(paramEntity);
//获取执行请求的HttpClient
HttpClient client = new DefaultHttpClient(connParams);
//执行请求,获取响应
HttpResponse response = client.execute(request);
//判断是否正确响应
if(response.getStatusLine().getStatusCode() == 200){
//获取响应内容
HttpEntity entity = response.getEntity();
if(entity!=null){
content = EntityUtils.toString(entity, "utf-8");
Log.d("TAG", "content: " + content);
content = parseJson(content).toString();
}else{
content = "服务器没有给出响应内容";
}
}else{
content = "获取响应失败!";
}
}catch(SocketTimeoutException e){
Toast.makeText(this, "请求超时!", Toast.LENGTH_LONG).show();
}catch(IOException e){
e.printStackTrace();
Toast.makeText(this, "网络连接出错!", Toast.LENGTH_LONG).show();
}
return content;
}
如何避免ANR:
Thread + Handler
AsyncTask
关于Handler:
http://www.cnblogs.com/dawei/archive/2011/04/09/2010259.html
http://blog.csdn.net/cugbabybear/article/details/8805159
http://blog.sina.com.cn/s/blog_6ee33f040101d7bx.html
关于AsyncTask:
AsyncTask:异步任务类<----------------------->handler
//如果我有耗时工作,并且耗时工作结束之后要更新UI
异步任务的泛型类型
AsynTask<参数,进度条参数,返回值>
启动异步任务类: 调用 execute(参数); //不定长参数
当调用execute的时候执行 doInBackground(参数)。
doInBackground方法在子线程执行,当其执行完毕后返回返回值,
然后执行onPostExe
扩展: 网络通信的中文乱码问题
网络通信中,产生乱码的原因主要是通信过程中使用了不同的编码方式:服务器中的编码方式,传输过程中的编码方式,传输到达中断设备的编码方式。因此在传输过程中就需要至少两次编码转换:首先从服务器编码转换为网络编码,再从网络编码转换为终端设备编码。在转换过程中发生任何情况都可能引起编码混乱,一般情况下我们可以通过以下两种方式来避免这个问题。
一种方式是:由于大部分终端设备都支持Unicode字符集,所以在连接网页时,我们希望网页数据在网络传输时使用utf-8方式传输,这样就可以很简单地将utf-8转换成
Unicode字符集了。
另一种方式是在数据传递过程中使用ISO-8859-1字符集,这样就是直接使用ASCII编码方式,当然在传递到终端设备时,需要将其数据反转才能够正常显示。归根结底,解决中文乱码只需要两个步骤:
使用getBytes("编码方式");来对汉字进行重编码,得到它的字节数组
再使用new String(Bytes[],"解码方式");来对字节数组进行相应的解码
作业描述:
访问服务器文件内容并通过TextView将内容显示出来
要求:1. 访问data.xml文件用HttpUrlConnection实现,通过Thread + Handler优化性能,要求必须设置超时连接参数,注意编码规范
2. 访问data.json文件用HttpClient实现,通过AsyncTask优化性能,要求必须设置超时连接参数,注意编码规范
http://note.youdao.com/share/?id=f14d304548003f65e34255d3ddf9df31&type=note
网络编程:Http通信与Socket通信(移动互联核心)
知识点概述:
1.Socket通信:面向连接(TCP)和无连接的(UDP)
2.HttpURLConnection 接口:Get和Post方式
3.HttpClient接口:Get和Post方式
知识点详述:
1 Socket通信
Socket称为”套接字“,用于描述IP地址和端口,它是支持TCP/IP协议的网络通信的基本操作单元。有两种主要的操作方式:面向连接(TCP协议)和无连接(UDP协议)的。面向连接的操作比无连接操作的效率更低,但是数据的安全性更高。
OSI七层模型
TCP与UDP区别:
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务,传输数据前经过“三次握手”建立连接,保证数据传输的可靠性,但效率比较低。一般用于对于数据传输安全性较高的场合。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议,面向无连接。UDP不提供可靠性,数据传输可能发生错序,丢包,但效率较高。一般用于对于实时性要求较高的场合。
Android Socket编程
(1)服务器实现步骤:
指定端口实例化一个ServerSocket 1. 实例化ServerSocket实例,指定端口号
调用ServerSocket的accept()以在等待连接期间造成阻塞 2. 调用accept方法,等待客户端请求
获取位于该底层Socket的流以进行读写操作 3. 有请求则返回Socket连接实例
将数据封装成流 4. 通过Socket获取输入流读取请求数据,并获得输出流做出响应
对Socket进行读写 5.关闭流
关闭打开的流
ServerSocket ss = null;
// 创建一个ServerSocket,监听一个端口号
try {
ss = new ServerSocket(8080);
// 等待一个socket连接
Socket s = ss.accept();
// 缓冲读取数据类
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
// 从流中读取一行数据
String msgFromClient = br.readLine();
System.out.println("msgFromClient:" + msgFromClient);
// 参数2:true 表示数据自动刷新
PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()), true);
pw.println("接受到了!");
//刷新数据
pw.flush();
} catch (IOException e) {
e.printStackTrace();
}
(2)客户端实现步骤:
通过IP地址和端口实例化Socket,请求连接服务器 1.实例化Socket实例,指定服务端ip,以及服务端监听此服务的端口号
获取Socket上的流以进行读写 2. 通过Socket获取输出流向服务端发送消息
把流包装进BufferedReader/PrintWriter的实例 3.再通过Socket获取输入流读取服务端响应数据
对Socket进行读写 4.关闭流
关闭打开的流
Socket s = null;
try {
//和服务器断建立连接
s = new Socket("127.0.0.1", 8080);
//将输出流输出
PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
pw.println("我是客户端,我给你一些数据");
// 刷新提交过去
pw.flush();
//接收客户端的消息
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String msgFromServer = br.readLine();
System.out.println("msgFromServer:" + msgFromServer);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
作业: http://www.cnblogs.com/-run/archive/2011/12/29/2306363.html
前序:HTTP通信 (B/S, C/S)
HTTP(超文本传输协议)用于传送www方式的数据,采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含了请求的方法、URI、协议版本,以及包含请求修饰符、
客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,响应的内容包括消息协议的版本、成功或者错误编码,还包含服务器信息、实体元信息以及可能的实体内容。它是一个属于应用层的面向对象的协议,由于其简洁、快速,它适用于分布式超媒体信息系统。在internet上,http通信通常发生在TCP/IP连接之上,缺省端口是TCP 80,但其他的端口也是可用的。这并不预示着http协议在internet或其它网络的其他协议之上才能完成,http只预示着一个可靠地传输。Android提供了HttpURLConnection和HttpClient接口来开发http程序。
2.HttpURLConnection 接口 java.net.*提供
HTTP通信中使用最多的就是Get和Post,Get请求可以获取静态页面,也可以把参数放在URL字符串后面,传递给服务器。Post与Get的不同之处在于Post的参数不是放在URL字符串里面,而是放在http请求数据中。HttpURLConnection是Java的标准类,继承自URLConnection类,两个类都是抽象类,无法直接实例化对象。其对象主要通过URL的openConnection方法获得。每次openConnection都将创建一个新的连接实例,在连接之前我们可以对其一些属性进行设置,比如超时时间等:
connection.setDoOutput(true); //设置输入流(Post时必须设置)
connection.setDoInput(true); // 设置输出流(Post时必须设置)
connection.setRequestMethod("POST"); // 设置方式为POST(Post时必须设置)
connection.setInstanceFollowRedirects(true); //设置该请求是否重定向
connection.disconnect(); //关闭HttpURLConnection连接
connection.setConnectionTimeout(int time); //设置连接超时
connection.setReadTimeout(int time); //设置读取超时
注:如果使用post方式,还需要设置请求的Content-Type
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
3. HttpClient接口(Apache接口,包名:org.apache.http.*),需要了解一些类:
HttpClient实现移动互联的步骤,以及需要的类:
1) 封装请求 HttpGet / HttpPost
2) 封装连接参数 HttpParams--》BasicHttpParams, HttpConnectionParams
注:如果是Get方式则省略3)4)步骤
3)封装请求参数 NameValuePair--》BasicNameValuePair--》List<NameValuePair>-->HttpEntity-->UrlEncodedFormEntity
4 ) 设置请求参数 HttpPost-->setEntity(请求参数)
5) 封装执行请求的客户端实例并且设置连接参数 HttpClient--》DefaultHttpClient(HttpParams)
6)发送请求,接收响应 client.execute(HttpGet/HttpPost)--->HttpResponse
7 ) 判断响应码是否是200,如果正常则接收响应数据 resp.getStatusLine().getStatusCode()-->200-->getEntity()-->HttpEntity
8 ) 根据响应数据类型进行转换
(图片--》HttpEntity.getConent()-->InputStream--->BitmapFactory.decodeStream())
(文本--》EntityUtils.toString(HttpEntity, "utf-8")
(1)HttpClient使用Get方式获取数据,需要使用HttpGet来构建一个Get方式的http请求,然后通过HttpClient来执行这个请求,HttpResponse在接收这个请求后给出响应,最后通过“HttpResponse.getStatusLine().getStatusCode()"来判断请求是否成功,并处理。可以直接使用如下方法将响应的实体元信息转化为字符串
String strResult = EntityUtils.toString(httpResponse.getEntity());
HttpClient的Get方式请求步骤:
?封装HttpGet请求 new HttpGet(urlStr)
? 通过HttpParams设置连接参数
?获取HttpClient实例 new DefaultHttpClient();
?发送请求,接收响应
HttpResponse = httpClient.excute(httpGet)
?判断响应码是不是200.如果是200,接收响应数据
HttpEntity = httpResponse.getEntity();
HttpClient使用Post方式获取数据稍微复杂一点。首先好使用HttpPost来构建一个Post方式的http请求,
HttpPost httpRequest=new HttpPost("url");
需要使用NameValuePair来保存要传递的参数,可以使用BasicNameValuePair来构造一个要被传递的参数,然后通过add方法添加这个参数到NameValuePair中,
List<NameValuePair> params=new ArrayList<NameValuePair>(); //使用NameValuePair来保存要传递的Post参数
params.add(new BasicNameValuePair("par","HttpClient_android_Post"));
//添加要传递的参数Post方式还需要设置所使用的字符集,最后就和Get方式一样通过HttpClient来请求这个连接,返回响应并处理,
HttpEntity httpentity=new UrlEncodedFormEntity(params,"utf-8"); //设置字符集
httpRequest.setEntity(httpentity); //为请求设置实体元信息
(2)DefaultHttpClient是默认的一个HTTP客户端,我们可以使用它创建一个HTTP连接。
代码如下:HttpClient hc=new DefaultHttpClient();
(3) HttpResponse是一个HTTP连接响应,当执行一个http连接后,就会返回一个HttpResponse,可以通过其获得一些响应信息。下面是请求一个HTTP连接并获得该请求是否成功的代码:
HttpResponse hresponse=hc.execute(httpRequest);
if(hresponse.getStatusLine().getStatusCode()==HttpStatus.SC_OK){ //连接成功
}
示例代码:
//HttpClient接口通过Post方式获取数据
private String requestStringGet(String urlStr, String param){
String content = "";
//构建Post请求
HttpPost request = new HttpPost(urlStr);
//构建设置连接参数实例
HttpParams connParams = new BasicHttpParams();
//设置连接超时
HttpConnectionParams.setConnectionTimeout(connParams, 10 * 1000);
//设置Socket超时
HttpConnectionParams.setSoTimeout(connParams, 10 * 1000);
//构建请求参数
List<NameValuePair> requestParams = new ArrayList<NameValuePair>();
requestParams.add(new BasicNameValuePair("name", param));
requestParams.add(new BasicNameValuePair("pass", param));
try{
//将请求参数列表转化为请求实体元信息
HttpEntity paramEntity = new UrlEncodedFormEntity(requestParams,"utf-8");
//将请求实体元信息设置到请求中
request.setEntity(paramEntity);
//获取执行请求的HttpClient
HttpClient client = new DefaultHttpClient(connParams);
//执行请求,获取响应
HttpResponse response = client.execute(request);
//判断是否正确响应
if(response.getStatusLine().getStatusCode() == 200){
//获取响应内容
HttpEntity entity = response.getEntity();
if(entity!=null){
content = EntityUtils.toString(entity, "utf-8");
Log.d("TAG", "content: " + content);
content = parseJson(content).toString();
}else{
content = "服务器没有给出响应内容";
}
}else{
content = "获取响应失败!";
}
}catch(SocketTimeoutException e){
Toast.makeText(this, "请求超时!", Toast.LENGTH_LONG).show();
}catch(IOException e){
e.printStackTrace();
Toast.makeText(this, "网络连接出错!", Toast.LENGTH_LONG).show();
}
return content;
}
如何避免ANR:
Thread + Handler
AsyncTask
关于Handler:
http://www.cnblogs.com/dawei/archive/2011/04/09/2010259.html
http://blog.csdn.net/cugbabybear/article/details/8805159
http://blog.sina.com.cn/s/blog_6ee33f040101d7bx.html
关于AsyncTask:
AsyncTask:异步任务类<----------------------->handler
//如果我有耗时工作,并且耗时工作结束之后要更新UI
异步任务的泛型类型
AsynTask<参数,进度条参数,返回值>
启动异步任务类: 调用 execute(参数); //不定长参数
当调用execute的时候执行 doInBackground(参数)。
doInBackground方法在子线程执行,当其执行完毕后返回返回值,
然后执行onPostExe
扩展: 网络通信的中文乱码问题
网络通信中,产生乱码的原因主要是通信过程中使用了不同的编码方式:服务器中的编码方式,传输过程中的编码方式,传输到达中断设备的编码方式。因此在传输过程中就需要至少两次编码转换:首先从服务器编码转换为网络编码,再从网络编码转换为终端设备编码。在转换过程中发生任何情况都可能引起编码混乱,一般情况下我们可以通过以下两种方式来避免这个问题。
一种方式是:由于大部分终端设备都支持Unicode字符集,所以在连接网页时,我们希望网页数据在网络传输时使用utf-8方式传输,这样就可以很简单地将utf-8转换成
Unicode字符集了。
另一种方式是在数据传递过程中使用ISO-8859-1字符集,这样就是直接使用ASCII编码方式,当然在传递到终端设备时,需要将其数据反转才能够正常显示。归根结底,解决中文乱码只需要两个步骤:
使用getBytes("编码方式");来对汉字进行重编码,得到它的字节数组
再使用new String(Bytes[],"解码方式");来对字节数组进行相应的解码
作业描述:
访问服务器文件内容并通过TextView将内容显示出来
要求:1. 访问data.xml文件用HttpUrlConnection实现,通过Thread + Handler优化性能,要求必须设置超时连接参数,注意编码规范
2. 访问data.json文件用HttpClient实现,通过AsyncTask优化性能,要求必须设置超时连接参数,注意编码规范