移动云

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 4090|回复: 0

Android网络开发详解

[复制链接]
发表于 2012-2-21 16:50:17 | 显示全部楼层 |阅读模式
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平台引入了 ApacheHttpClient 的同时还提供了对它的一些封装和扩展,例如设置缺省的HTTP超时和缓存大小等。早期的Android 曾同时包括Commons HttpClientorg.apache.commons.httpclient.*)和 HttpComponents org.apache.http.client.*),不过当前版本 (1.5)中开发者只能使用后者,也就是说类似以下的一些类:
使用这部分接口的基本操作与 java.net.*基本类似,主要包括:
创建 HttpClient以及 GetMethod/ PostMethodHttpRequest等对象
设置连接参数
执行 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();   
      }  
  importorg.apache.http.HttpEntity;
        importorg.apache.http.HttpHost;
        importorg.apache.http.HttpResponse;
        importorg.apache.http.auth.AuthScope;
        importorg.apache.http.auth.UsernamePasswordCredentials;
        importorg.apache.http.client.methods.HttpGet;
        importorg.apache.http.conn.params.ConnRoutePNames;
        importorg.apache.http.params. HttpConnectionParams;
        importorg.apache.http.client.params. HttpClientParams;

        try{
            //创建 HttpParams以用来设置 HTTP参数(这一部分不是必需的)
           HttpParams params = newBasicHttpParams();

            //设置连接超时和 Socket超时,以及 Socket缓存大小
           HttpConnectionParams.setConnectionTimeout(params,20 * 1000);
           HttpConnectionParams.setSoTimeout(params,20 * 1000);
           HttpConnectionParams.setSocketBufferSize(params,8192);

            //设置重定向,缺省为 true
           HttpClientParams.setRedirecting(params,true);

            //设置 useragent
            HttpProtocolParams.setUserAgent(params,userAgent);

            //创建一个 HttpClient实例
            //注意 HttpClienthttpClient = new HttpClient(); CommonsHttpClient
            //中的用法,在 Android1.5 中我们需要使用 Apache的缺省实现 DefaultHttpClient
           HttpClient httpClient = newDefaultHttpClient(params);

            //创建 HttpGet方法,该方法会自动处理 URL地址的重定向
           HttpGet httpGet = newHttpGet ("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) {  
          //  
      }  


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|管理员QQ:44994224|邮箱(t268studio@gmail.com)|Archiver|MCLOUDER

GMT+8, 2025-7-2 05:45 , Processed in 0.047654 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表