Android 网络开发详解

1.概要

本文主要介绍在Android平台上开发网络应用的一些常用接口。

2. Android平台上可以使用的几种网络接口

Android平台的网络应用绝大部分都是基于Java的编程接口的,也就是说我们开发类似的运用的时候可以有多种选择,比J2me确实好多了。

2.1.标准Java接口

java.net.*下面提供了访问HTTP服务的基本功能。使用这部分接口的基本操作主要包括:

·创建URL以及URLConnection / HttpURLConnection对象

·设置连接参数

·连接到服务器

·向服务器写数据

·从服务器读取数据

       import java.io.InputStream;          import java.io.OutputStream;          import java.net.URL;          import java.net.URLConnection;          import java.net.HttpURLConnection;          try {              // 创建一个 URL 对象              URL url = new URL(your_url);              // 创建一个 URL 连接,如果有代理的话可以指定一个代理。              URLConnection connection = url.openConnection(Proxy_yours);              // 对于 HTTP 连接可以直接转换成 HttpURLConnection,              // 这样就可以使用一些 HTTP 连接特定的方法,如 setRequestMethod() 等              //HttpURLConnection connection =          (HttpURLConnection)url.openConnection(Proxy_yours);              // 在开始和服务器连接之前,可能需要设置一些网络参数              connection.setConnectTimeout(10000);              connection.addRequestProperty("User-Agent",                    "J2me/MIDP2.0");              // 连接到服务器              connection.connect();              // 往服务器写数据,数据会暂时被放到内存缓存区中              // 如果仅是一个简单的 HTTP GET,这一部分则可以省略              OutputStream outStream = connection.getOutputStream();              ObjectOutputStream objOutput = new ObjectOutputStream(outStream);              objOutput.writeObject(new String("this is a string..."));              objOutput.flush();              // 向服务器发送数据并获取应答              InputStream in = connection.getInputStream();              // 处理数据              ...          } catch (Exception e) {              // 网络读写操作往往会产生一些异常,所以在具体编写网络应用时              // 最好捕捉每一个具体以采取相应措施          }  

2.2. Apache接口

Apache HttpClient是一个开源项目,弥补了java.net.*灵活性不足的缺点,为客户端的HTTP编程提供高效、最新、功能丰富的工具包支持。Android平台引入了Apache HttpClient的同时还提供了对它的一些封装和扩展,例如设置缺省的HTTP超时和缓存大小等。早期的Android曾同时包括Commons HttpClient(org.apache.commons.httpclient.*)和HttpComponents(org.apache.http.client.*),不过当前版本(1.5)中开发者只能使用后者,也就是说类似以下的一些类:

使用这部分接口的基本操作与java.net.*基本类似,主要包括:

·创建HttpClient以及GetMethod / PostMethod,HttpRequest等对象

·设置连接参数

·执行HTTP操作

·处理服务器返回结果

import org.apache.http.HttpEntity;         import org.apache.http.HttpHost;         import org.apache.http.HttpResponse;         import org.apache.http.auth.AuthScope;         import org.apache.http.auth.UsernamePasswordCredentials;         import org.apache.http.client.methods.HttpGet;         import org.apache.http.conn.params.ConnRoutePNames;         import org.apache.http.params. HttpConnectionParams;         import org.apache.http.client.params. HttpClientParams;         try {             // 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)             HttpParams params = new BasicHttpParams();             // 设置连接超时和 Socket 超时,以及 Socket 缓存大小            HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);             HttpConnectionParams.setSoTimeout(params, 20 * 1000);             HttpConnectionParams.setSocketBufferSize(params, 8192);             // 设置重定向,缺省为 true             HttpClientParams.setRedirecting(params, true);             // 设置 user agent             HttpProtocolParams.setUserAgent(params, userAgent);             // 创建一个 HttpClient 实例             // 注意 HttpClient httpClient = new HttpClient(); 是Commons HttpClient              // 中的用法,在 Android 1.5 中我们需要使用 Apache 的缺省实现 DefaultHttpClient             HttpClient httpClient = new DefaultHttpClient(params);             // 创建 HttpGet 方法,该方法会自动处理 URL 地址的重定向             HttpGet httpGet = new HttpGet ("http://www.test_test.com/");             HttpResponse response = client.execute(httpGet);             if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {                 // 错误处理,例如可以在该请求正常结束前将其中断                 httpGet.abort();             }             // 读取更多信息             Header[] headers = response.getHeaders();             HttpEntity entity = response.getEntity();             Header header = response.getFirstHeader("Content-Type");         } catch (Exception ee) {         } finally {             // 释放连接             client.getConnectionManager().shutdown();          }  

import org.apache.http.HttpEntity;

import org.apache.http.HttpHost;

import org.apache.http.HttpResponse;

import org.apache.http.auth.AuthScope;

import org.apache.http.auth.UsernamePasswordCredentials;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.conn.params.ConnRoutePNames;

import org.apache.http.params. HttpConnectionParams;

import org.apache.http.client.params. HttpClientParams;

try {

//创建HttpParams以用来设置HTTP参数(这一部分不是必需的)

HttpParams params = new BasicHttpParams();

//设置连接超时和Socket超时,以及Socket缓存大小

HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);

HttpConnectionParams.setSoTimeout(params, 20 * 1000);

HttpConnectionParams.setSocketBufferSize(params, 8192);

//设置重定向,缺省为true

HttpClientParams.setRedirecting(params, true);

//设置user agent

HttpProtocolParams.setUserAgent(params, userAgent);

//创建一个HttpClient实例

//注意HttpClient httpClient = new HttpClient();是Commons HttpClient

//中的用法,在Android 1.5中我们需要使用Apache的缺省实现DefaultHttpClient

HttpClient httpClient = new DefaultHttpClient(params);

//创建HttpGet方法,该方法会自动处理URL地址的重定向

HttpGet httpGet = new HttpGet ("http://www.test_test.com/");

HttpResponse response = client.execute(httpGet);

if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

//错误处理,例如可以在该请求正常结束前将其中断

httpGet.abort();

}

//读取更多信息

Header[] headers = response.getHeaders();

HttpEntity entity = response.getEntity();

Header header = response.getFirstHeader("Content-Type");

} catch (Exception ee) {

//

} finally {

//释放连接

client.getConnectionManager().shutdown();

}

以下例子以HttpGet方式通过代理访问HTTPS网站:

try{

HttpClienthttpClient=newHttpClient();

//设置认证的数据

httpClient.getCredentialsProvider().setCredentials(

newAuthScope("your_auth_host",80,"your_realm"),

newUsernamePasswordCredentials("username","password"));

//设置服务器地址,端口,访问协议

HttpHosttargetHost=newHttpHost("www.test_test.com",443,"https");

//设置代理

HttpHostproxy=newHttpHost("192.168.1.1",80);

httpClient.getParams().setParameter

(ConnRoutePNames.DEFAULT_PROXY,proxy);

//创建一个HttpGet实例

HttpGethttpGet=newHttpGet("/a/b/c");

//连接服务器并获取应答数据

HttpResponseresponse=httpClient.execute(targetHost,httpGet);

//读取应答数据

intstatusCode=response.getStatusLine().getStatusCode();

Header[]headers=response.getHeaders();

HttpEntityentity=response.getEntity();

}catch(Exceptionee){

//

2.3.Android接口

android.net.*实际上是通过对Apache的HttpClient的封装来实现的一个HTTP编程接口,同时还提供了HTTP请求队列管理,以及HTTP连接池管理,以提高并发请求情况下(如转载网页时)的处理效率,除此之外还有网络状态监视等接口。

以下是一个通过AndroidHttpClient访问服务器的最简例子:

importimportandroid.net.http.AndroidHttpClient;

try{

AndroidHttpClientclient=AndroidHttpClient.newInstance(“your_user_agent”);

//创建HttpGet方法,该方法会自动处理URL地址的重定向

HttpGethttpGet=newHttpGet("http://www.test_test.com/");

HttpResponseresponse=client.execute(httpGet);

if(response.getStatusLine().getStatusCode()!=HttpStatus.SC_OK){

//错误处理

}

//关闭连接

client.close();

}catch(Exceptionee){

//

}

import importandroid.net.http.AndroidHttpClient;

try {

AndroidHttpClient client = AndroidHttpClient.newInstance(“your_user_agent”);

//创建HttpGet方法,该方法会自动处理URL地址的重定向

HttpGet httpGet = new HttpGet ("http://www.test_test.com/");

HttpResponse response = client.execute(httpGet);

if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

//错误处理

}

//关闭连接

client.close();

} catch (Exception ee) {

//

}

另外当我们的应用需要同时从不同的主机获取数目不等的数据,并且仅关心数据的完整性而不关心其先后顺序时,也可以使用这部分的接口。典型用例就是android.webkit在转载网页和下载网页资源时,具体可参考android.webkit.*中的相关实现。

更多相关文章

  1. Android Android利用Fiddler进行网络数据抓包
  2. Android请求获取Java后端数据,登录界面例子
  3. android ListView没有数据时信息显示
  4. Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedC
  5. Android向服务器传接和接收数据的方法汇总
  6. 【iOS-Android开发对比】之 数据存储
  7. (一)Android数据结构学习之链表
  8. Android中sqlite数据库的简单使用

随机推荐

  1. android OS Service
  2. 捕获Android文本输入框的软键盘完成(Done
  3. ANDROID图片压缩代码
  4. Android在onCreate()中获得控件尺寸
  5. android 开源项目列表
  6. Android(安卓)Service中判断系统全屏
  7. android 方式实现imageview圆角
  8. gcc for android
  9. android Style应用
  10. 从源码中查看当前android版本