Android的网络与通信
第一部分 Android网络基础
Android平台浏览器采用了WeBKit引擎,这款名为Chorme Lite的Web浏览器拥有强大扩展特性,
每个开发者都以为编写自己的插件,使得浏览器的功能更加完善。
目前Android平台有3种网络接口。
第一种 java.net.*(标准java接口)
此接口提供与联网有关的类,包括流和数据包套接字、Internet协议、常见HTTP处理。
如:创建URL以及URLConnection/HttpURLConnection对象、
设置连接参数、连接服务器、向服务器写数据、从服务器读取数据等通信。
下例为常见java.net包的Http例子:
try{
URL url = new URL("http://www.google.com%22)//定义地址
HttpURLConnection http = (HttpURLConnection) url.openConnection();//打开连接
int nRC = http.getResponseCode();//得到连接状态
if(nRC == HttpURLConnection.HTTP_OK){
InputStream is = http.getInputStream();//取得数据
.....//处理数据
}
}catch(Exception e){
//因是连接网络,不免会出现一些异常,所以必须处理这些异常
}
第二种 Apache接口
Android提供的Apache HttpClient,它是一个开源项目,功能更加完善,
为客户端的Http编程提供高效、最新、功能丰富的工具包。
Android目前使用的是HttpClient4.0(org.apache.http.*),
可将Apache看为目前流行的开源Web服务器,
主要包括创建HttpClient以及Get/Post、HttpRequest等对象,设置连接参数,执行HTTP操作,
处理服务器返回结果等功能。
下例为使用android.net.http.*包的例子:
try{
HttpClient hc = new DefaultHttpClient();//创建HttpClient,这里使用DefaultHttpClient表示默认属性
HttpGet hg = new HttpGet("http://www.google.com%22);//HttpGet实例
HttpResponse rp = hc.execute(hg);//连接
if(rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
InputStream is = rp.getEntity().getContent();
.....//处理数据
}
}catch(IOEeception e){
}
第三中 Android网络接口
android.net.*包实际是通过Apache中HttpClient的封装来实现的一个HTTP编程接口,
同时还提供了Http请求队列管理以及Http连接池管理,以提高并发请求情况下(如装载网页时)的效率
还包括 网络状态监视等接口,网络访问的Socket,常用的Uri类以及有关WiFi相关的类等等。
下例为最简单的Socket连接
try{
InetAddress ia = InetAddress.getByName("192.168.1.110");//IP地址
Socket sk = new Socket(inetAddress,61203,true);//端口
InputStream is =sk.getInputStream();//得到数据
OutputStream os = sk.getOutputStream();
.....//数据处理
os.close();
is.close();
sk.close();
}catch(UnknownHostException e){
}catch(IOException e){
}
第二部分 Http通信
Android提供了HttpURLConnection和HttpClient接口来开发Http程序。
Http(Hyper Text Transfer Protocol,超文本传输协议)用于传输WWW方式的数据。
HTTP通信中客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。
从建立连接到关闭连接的过程为"一次连接"。
要保证客户端程序在线状态,需要不断地向服务器发送连接请求。
通常的做法是即使不需要获得任何数据,客户端也保持没隔一段固定的时间向服务器发送一次“保持连接”的请求,
服务器在收到该请求后对客户端进行回复,表明知道客户端在线。
若长时间无法收到客户端的请求,则认为客户端下线,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
很多情况下,需要服务器端主动向客户端发送数据以保持客户端与服务器数据的实时与同步。
Http通信中,服务器需要等到客户端发送一次请求后才能将数据传回给客户端,
因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,
同时也是在"询问"服务器是否有新数据,如果有就将数据传给客户端。
Http采用请求/响应的模式。
客户端向服务器发送一个请求,
请求头包含了请求方法,URI,协议版本,以及包含请求修饰符,客户信息和内容,类似于MIME消息结构。
服务器以一个状态行作为响应,响应的内容包含消息协议的版本,成功或错误编码,
还包含服务器消息,实体元信息以及可能的实体内容。
它是一个属于应用层的面向对象的协议,适用于分布式超媒体信息系统。
许多HTTP通信是由一个用户代理初始化的,并且包括一个申请在源服务器上资源的请求。
最简单的情况可能是在用户代理和服务器之间通过一个单独的连接来完成。
在Internet上,Http通信通常发生在TCP/IP连接上,缺省端口是TCP80.其他端口也是可用的。
第一种 HttpURLConnection接口
Http通信中使用最多的是Get和Post.
Get请求可用获得静态页面,也可以把参数放在URL字串的后面,传递给服务器。
Post参数不是放在URL字串里面,而是放在http请求数据中。
URLConnection与HttpURLConnection都是抽象类,无法直接实例化对象。
其对象主要通过URL的openConnection方法获得,
但openConnection方法只是创建URLConnection或者HttpURLConnection 的实例,并不是进行真正的连接操作。
因此在连接之前我们可用对一些属性进行设置
对HttpConnection实例的属性设置:
connection.setDoOutput(true);//设置输出流
connection.setDoInput(true);//设置输出流
connection.setRequestMethod("POST");//设置方式为POST
connection.setUseCaches(false);//Post请求不能使用缓存
urlConn.disconnect();//连接完成之后关闭HttpURLConnection连接
首先在服务器上建立一个不需要传递参数的网页http1.jsp文件。代码如下:
<HTML>
<HEAD>
<TITLE>
Http Test
</TITLE>
</HEAD>
<BODY>
<% out.println("<h1>HTTP TEST<br>http test</h1>"); %>
</BODY>
</HTML>
再创建一个适用Get和Post来传递参数的网页httpget.jsp 代码如下:
<%@ page language="java" import = "java.util.*" pageEncoding = "gb2312" %>
<HTML>
<HEAD>
<TITLE>
Http Test
</TITLE>
</HEAD>
<BODY>
<%
String type = request.getParameter("par");
String result = new String(type.getBytes("iso-8859-1")),"gb2312");
out.println("<h1>parameters:"+result+"</h1>");
%>
</BODY>
</HTML>
以下例中通过Android程序分别以不同的方式访问这两个页面。
main.xm 文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_wid
补充:移动开发 , Android ,