参考链接:http://www.cnblogs.com/qingblog/archive/2012/06/15/2550735.html
接上一篇文章:Android网络通信(1):Android网络基础。
Http通信
Android提供了HttpURLConnection和HttpClient接口来开发Http程序。
Http(Hyper Text Transfer Protocol,超文本传输协议)用于传输WWW方式的数据。
HTTP通信中客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程为"一次连接"。要保证客户端程序在线状态,需要不断地向服务器发送连接请求。通常的做法是即使不需要获得任何数据,客户端也保持没隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端在线。若长时间无法收到客户端的请求,则认为客户端下线,若客户端长时间无法收到服务器的回复,则认为网络已经断开。很多情况下,需要服务器端主动向客户端发送数据以保持客户端与服务器数据的实时与同步。Http通信中,服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在"询问"服务器是否有新数据,如果有就将数据传给客户端。
Http采用请求/响应的模式。客户端向服务器发送一个请求,请求头包含了请求方法,URI,协议版本,以及包含请求修饰符,客户信息和内容,类似于MIME消息结构。服务器以一个状态行作为响应,响应的内容包含消息协议的版本,成功或错误编码,还包含服务器消息,实体元信息以及可能的实体内容。它是一个属于应用层的面向对象的协议,适用于分布式超媒体信息系统。许多HTTP通信是由一个用户代理初始化的,并且包括一个申请在源服务器上资源的请求。最简单的情况可能是在用户代理和服务器之间通过一个单独的连接来完成。
在Internet上,Http通信通常发生在TCP/IP连接上,缺省端口是TCP 80.其他端口也是可用的。
第一种、HttpURLConnection接口
Http通信中使用最多的是Get和Post.
Get请求可用获得静态页面,也可以把参数放在URL字串的后面,传递给服务器。
Post参数不是放在URL字串里面,而是放在http请求数据中。
URLConnection与HttpURLConnection都是抽象类,无法直接实例化对象。其对象主要通过URL的openConnection方法获得,但openConnection方法只是创建URLConnection或者HttpURLConnection
的实例,并不是进行真正的连接操作。因此在连接之前我们可用对一些属性进行设置。
步骤:
HttpURLConnection conn = (HttpURLConnection)new URL(path).openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); if(conn.getResponseCode() == 200){ InputStream inStream = conn.getInputStream(); byte[] data = StreamTool.read(inStream); //BufferedReader br = new BufferedReader(new InputStreamReader(inStream)); return new String(data); } is.close(); br.close(); Conn.disconnect();
url = new URL(urlAddress); uRLConnection = (HttpURLConnection)url.openConnection(); uRLConnection.setDoInput(true); uRLConnection.setDoOutput(true); uRLConnection.setRequestMethod("POST"); uRLConnection.setUseCaches(false); uRLConnection.setInstanceFollowRedirects(false); uRLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); uRLConnection.connect(); DataOutputStream out = new DataOutputStream(uRLConnection.getOutputStream()); out.writeBytes(String); out.flush(); out.close(); InputStream is = uRLConnection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); is.close(); br.close(); uRLConnection.disconnect();
第二种、HttpClient接口
与第一种相比HttpClient对java.net中的类做了封装和抽象,更适合我们在Android上开发互联网应用。
需了解如下一些类:
1、ClinetConnectionManager接口
此接口是客户端连接管理器接口,有如下抽象方法:
ClientConnectionManager 关闭所有无效、超时的连接
closeIdleConnections 关闭空闲的连接
releaseConnection 释放一个连接
requestConnection 请求一个新的连接
shutdown 关闭管理器并释放资源
2、DefaultHttpClient
是默认的一个HTTP客户端,可用它创建一个Http连接 代码如下:
HttpClinet httpclinet = new HttpClient();
3、HttpResponse是一个HTTP连接响应,当执行一个HTTP连接后,就会返回一个HttpResponse,可以通过HttpResponse获得一些响应的信息。
下例为请求一个HTTP连接并获得该请求是否成功的代码:
HttpResponse httpResponse = httpclient.execute(httpRequest);
if(httpResponse.getStatusLine(),getStatusCode() == HttpStates.SC_OK){//判断是否连接成功
}
HttpGet httpGet = new HttpGet(getUrl); HttpClient hc = new DefaultHttpClient(); try { HttpResponse ht = hc.execute(httpGet); if(ht.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ HttpEntity he = ht.getEntity(); InputStream is = he.getContent(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String response = "", readLine = null; while((readLine =br.readLine()) != null){ //response = br.readLine(); response = response + readLine; } is.close(); br.close(); }catch (ClientProtocolException e) { e.printStackTrace(); return "exception"; } catch (IOException e) { e.printStackTrace(); return "exception"; } }
HttpPost httpPost = new HttpPost(urlAddress); HttpEntity he = new UrlEncodedFormEntity(params, "gbk"); httpPost.setEntity(he); HttpClient hc = new DefaultHttpClient(); try { ......
实时更新
前两节只是简单地一次性获取网页数据,而在实际开发中更多的是需要我们实时获取最新数据,比如道路流量,实时天气信息等等。
可通过一个线程来控制视图的更新,要实时的从网络获取数据,其实就是把获取网络数据的代码写到线程中,不停的进行更新。
注意:Android中更新视图不能直接在线程中进行,所以需要使用Handler来实现更新。