Android网络编程概述
一. Android平台网络API接口
1) java.net.*(标准Java接口)
java.net.*提供与联网有关的类,包括流、数据包套接字(socket)、Internet协议、常见Http处理等。比如:创建URL,以及URLConnection/HttpURLConnection对象、设置链接参数、链接到服务器、向服务器写数据、从服务器读取数据等通信。这些在Java网络编程中均有涉及。
2) org.apache接口
对于大部分应用程序而言JDK本身提供的网络功能已远远不够,这时就需要Android提供的Apache HttpClient了。它是一个开源项目,功能更加完善,为客户端的Http编程提供高效、最新、功能丰富的工具包支持。
3) android.net.*(Android网络接口)
常常使用此包下的类进行Android特有的网络编程,如:访问WiFi,访问Android联网信息,邮件等功能。
二. 网络架构主要有两种模式B/S,C/S
1) B/S就是浏览器/服务器端模式了,通过应用层的HTTP协议通信,不需要特定客户端软件,而是需要统一规范的客户端,简而言之就是Android网络浏览器(如chrome,UcWeb,QQ浏览器等等)访问web服务器端的方式。
2) C/S就客户端/服务器端模式,通过任意的网络协议通信,需要特定的客户端软件。
三. 服务器端返回客户端的内容有三种方式:
a)以HTML代码的形式返回。
b)以XML字符串的形式返回,做Android开发时这种方式比较多。返回的数据需要通过XML解析(SAX、DOM,Pull,等)器进行解析(必备知识)。
c)以json对象的方式返回。
1、HTTP协议
1.1 HttpURLConnection连接URL
1) 创建一个URL对象 URL url = new URL(http://www.baidu.com);
2) 利用HttpURLConnection对象从网络中获取网页数据HttpURLConnection conn = (HttpURLConnection) url.openConnection();
3) 设置连接超时conn.setConnectTimeout(6*1000);
4) 对响应码进行判断if (conn.getResponseCode() != 200) throw new RuntimeException("请求url失败"); //从Internet获取网页,发送请求,将网页以流的形式读回来
5) 得到网络返回的输入流InputStream is = conn.getInputStream();
6) String result = readData(is, "GBK"); //文件流输入出文件用outStream.write
7) conn.disconnect();
总结:
--记得设置连接超时,如果网络不好,Android系统在超过默认时间会收回资源中断操作.
--返回的响应码200,是成功.
--在Android中对文件流的操作和Java SE上面是一样的.
--在对大文件的操作时,要将文件写到SDCard上面,不要直接写到手机内存上.
--操作大文件时,要一遍从网络上读,一遍要往SDCard上面写,减少手机内存的使用.这点很重要,面试经常会被问到.
--对文件流操作完,要记得及时关闭.
1.2 向服务器端发送请求参数
步骤:
1) 创建URL对象: URL realUrl = new URL(requestUrl);
2) 通过HttpURLConnection对象,向网络地址发送请求 HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
3) 设置容许输出: conn.setDoOutput(true);
4) 设置不使用缓存: conn.setUseCaches(false);
5) 设置使用POST的方式发送: conn.setRequestMethod("POST");
6) 设置维持长连接: conn.setRequestProperty("Connection", "Keep-Alive");
7) 设置文件字符集: conn.setRequestProperty("Charset", "UTF-8");
8) 设置文件长度: conn.setRequestProperty("Content-Length", String.valueOf(data.length));
9) 设置文件类型: conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
10) 设置HTTP请求头: conn.setRequestProperty("Accept","image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
11) 设置语言:conn.setRequestProperty("Accept-Language“,"zh-CN");
1.3. 向服务器端发送xml数据(也称为实体Entity)
XML格式是通信的标准语言,Android系统也可以通过发送XML文件传输数据.
1) 将生成的XML文件写入到byte数组中,并设置为UTF-8:byte[] xmlbyte = xml.toString().getBytes("UTF-8");
2) 创建URL对象,并指定地址和参数:URL url = new URL(http://localhost:8080/itcast/contanctmanage.do?method=readxml);
3) 获得链接:HttpURLConnection conn = (HttpURLConnection) url.openConnection();
4) 设置连接超时:conn.setConnectTimeout(6* 1000);
5) 设置允许输出conn.setDoOutput(true);
6) 设置不使用缓存:conn.setUseCaches(false);
7) 设置以POST方式传输:conn.setRequestMethod("POST");
8) 维持长连接:conn.setRequestProperty("Connection", "Keep-Alive");
9) 设置字符集:conn.setRequestProperty("Charset", "UTF-8");
10) 设置文件的总长度:conn.setRequestProperty("Content-Length", String.valueOf(xmlbyte.length));
11) 设置文件类型:conn.setRequestProperty("Content-Type","text/xml; charset=UTF-8");
12) 以文件流的方式发送xml数据:outStream.write(xmlbyte);
总结:
--我们使用的是用HTML的方式传输文件,这个方式只能传输一般在5M一下的文件.
--传输大文件不适合用HTML的方式,传输大文件我们要面向Socket编程.确保程序的稳定性
--将地址和参数存到byte数组中:byte[] data = params.toString().getBytes();
二、基于Socket通信
Socket编程比基于URL的网络编程提供了更高的传输效率,更强大的功能和更灵活的控制。在Java中已经是层次最低的网络编程接口,在Java中要直接操作协议中更低的层次,那就只有使用JNI了,那基本属于本地语言的范畴。
三、其它网络相关技术
3.1、Android WebView控件
在android app 中嵌入网页的形式。
此外,通过webview可以实现HTML<------->JavaScript<-------->Android Java 交互,访问本地手机硬件。
例如:
1) webview.addJavascriptInterface(Object obj, String interfaceName))方法, 让Java方法可以在javascript中被调用;
void |
addJavascriptInterface(
Object obj,
String interfaceName)
Use this function to bind an object to JavaScript so that the methods can be accessed from JavaScript.
|
webview.loadUrl("javascript:show('"+json+"')");//调用js的show方法