现在的位置: 首页 > 综合 > 正文

Android网络开发详解

2013年12月11日 ⁄ 综合 ⁄ 共 8328字 ⁄ 字号 评论关闭

转自http://kuikui.javaeye.com/blog/418500

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

 {   

           HttpClient httpClient = 
new

 HttpClient();   

  

           
// 
设置认证的数据

  

           httpClient.getCredentialsProvider().setCredentials(   

                   
new

 AuthScope(
"your_auth_host"

80

"your_realm"
),      

                   
new

 UsernamePasswordCredentials(
"username"

"password"
));   

  

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

  

           HttpHost targetHost = 
new

 HttpHost(
"www.test_test.com"

443

"https"
);   

  

           
// 
设置代理

  

           HttpHost proxy = 
new

 HttpHost(
"192.168.1.1"

80
);   

           httpClient.getParams().setParameter   

                (ConnRoutePNames.DEFAULT_PROXY, proxy);      

  

           
// 
创建一个
 HttpGet 
实例

  

           HttpGet httpGet = 
new

 HttpGet(
"/a/b/c"
);   

  

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

  

           HttpResponse response = httpClient.execute(targetHost, httpGet);   

  

           
// 
读取应答数据

  

           
int

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

           Header[] headers = response.getHeaders();   

           HttpEntity entity = response.getEntity();   

       } 
catch

 (Exception ee) {   

           
// 

 

2.3. Android

接口

 

android.net.*

实际上是通过对
Apache


HttpClient

的封装来实现的一个
HTTP

编程接口,同时还提供了
HTTP

请求队列管理,


以及
HTTP

连接池管理,以提高并发请求情况下(如转载网页时)的处理效率,除此之外还有网络状态监视等接口。
 

     

以下是一个通过
AndroidHttpClient

访问服务器的最简例子:

 

import

 
import

 android.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) {   

          
//
  

      }  

 
import import android.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) {

抱歉!评论已关闭.