Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android開發實踐 網絡通信

Android開發實踐 網絡通信

編輯:關於Android編程

Android支持JDK提供的URL、URLConnection等網絡通信API,另外Android還內置了HttpClient。

1.URL

URL(Uniform Resource Locator)對象代表統一資源定位符,它是指向互聯網“資源”的指針。
URL格式:protocol://host:port/resourceName

拓展:JDK還提供了Uri(統一資源標識符)類

當我們獲取到URL對象後,即可調用如下方法來訪問URL對應的資源:

String getFile():獲取資源名
String getHost():獲取主機名
String getPath():獲取路徑部分
int getPort():獲取端口號
String getProtocol():獲取協議名稱
String getQuery():獲取查詢字符串部分
URLConnection openConnection():返回一個URLConnection對象(表示到URL所引用的遠程對象的連接)
InputStream openStream():打開連接,並返回一個用於讀取該URL資源的InputStream

2.使用URL讀取網絡資源

URL對象的openStream()方法可以非常方便的讀取該URL資源的InputStream。

public class URLTest extends Activity {
    // 從網絡上下載得到的圖片
    Bitmap bitmap;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread() {
            public void run() {
                try {
                    URL url = new URL("http://avatar.csdn.net/D/F/D/1_smartbetter.jpg");
                    /**
                     * 解析輸入流中的圖片
                     */
                    InputStream is = url.openStream(); // 打開URL對應資源的輸入流
                    bitmap = BitmapFactory.decodeStream(is); // 從InputStream中解析出圖片
                    is.close();
                    /**
                     * 使用IO將輸入流中的圖片下載到本地
                     */
                    is = url.openStream(); // 再次打開URL對應資源的輸入流
                    OutputStream os = openFileOutput("icon.jpg", MODE_WORLD_READABLE); // 打開手機文件對應的輸出流
                    byte[] buff = new byte[1024];
                    int hasRead = 0;
                    // 將URL對應的資源下載到本地
                    while((hasRead = is.read(buff)) > 0) {
                        os.write(buff, 0 , hasRead);
                    }
                    is.close();
                    os.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}

注意:需要添加訪問網絡權限

3.使用URLConnection提交請求

URL的openConnection()方法將返回一個URLConnection對象(表示應用程序和URL之間的通信連接),程序可通過URLConnection實例向該URL發送請求,讀取URL引用的資源。

如下GetPostUtil工具類向Web站點發送GET請求、POST請求,並取得響應:

public class GetPostUtil {
    /**
     * 向指定URL發送GET請求
     * @param url 請求參數,name1=value1&name2=value2
     * @param params
     * @return 遠程資源的響應
     */
    public static String doGet(String url, String params) {
        String result = "";
        BufferedReader in = null;
        try {
            String urlName = url + "?" + params;
            URL realUrl = new URL(urlName);
            URLConnection conn = realUrl.openConnection(); // 打開和URL之間的連接
            // 設置通用的請求屬性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
            conn.connect();  // 建立實際的連接
            Map> map = conn.getHeaderFields(); // 獲取所有響應頭字段
            // 遍歷所有的響應頭字段
            for (String key : map.keySet()) {
                System.out.println(key + ":" + map.get(key));
            }
            // 定義BufferedReader輸入流來讀取URL的響應
            in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += "\n" + line;
            }
        } catch (Exception e) {
            System.out.println("請求異常!" + e);
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return result;
    }
    /**
     * 向指定URL發送POST請求
     * @param url
     * @param params 請求參數,name1=value1&name2=value2
     * @return 遠程資源的響應
     */
    public static String doPost(String url, String params) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection(); // 打開和URL之間的連接
            // 設置通用的請求屬性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
            // 發送POST請求必須設置如下兩行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 獲取URLConnection對象對應的輸出流
            out = new PrintWriter(conn.getOutputStream()); 
            out.print(params);  // 發送請求參數
            out.flush(); // flush輸出流的緩沖
            // 定義BufferedReader輸入流來讀取URL的響應
            in = new BufferedReader(
                new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += "\n" + line;
            }
        }
        catch (Exception e) {
            System.out.println("請求異常!" + e);
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return result;
    }
}

4.使用HttpURLConnection

HttpURLConnection繼承了URLConnection做了改進,增加了一些用於操作HTTP資源的便捷方法:

int getResponseCode():獲取服務器的響應代碼
String getResponseMessage():獲取服務器的響應消息
String getRequestMethod():獲取發送請求的方法
void setRequestMethod(String method):設置發送請求的方法

5.使用HttpClient

HttpClient是Apache的一個開源項目,可用於發送HTTP請求,接受Http響應,不會緩存服務器的響應,不能執行HTML中JS代碼,也不會對頁面進行任何解析、處理。HttpClient就是一個增強版的HttpURLConnection。

接下來看看HttpClient的用法:

public class HttpClientTest extends Activity {
    HttpClient httpClient;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
        httpClient = new DefaultHttpClient(); // 創建DefaultHttpClient對象
        ...
    }
    /**
     * Get請求
     */
    public void doHttpClientGet(View view) {
        new Thread() {
            @Override
            public void run() {
                // 創建一個HttpGet對象
                HttpGet get = new HttpGet("http://192.168.1.10:8080/server/page.jsp"); 
                try {
                    // 發送GET請求
                    HttpResponse httpResponse = httpClient.execute(get);
                    HttpEntity entity = httpResponse.getEntity();
                    if (entity != null) {
                        // 讀取服務器響應
                        BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));
                        String line = null;
                        while ((line = br.readLine()) != null) {
                            System.out.println("服務器響應:"+line);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
    /**
     * Post請求
     * 模擬post請求登錄
     */
    public void doHttpClientPost(View view) {
        final String name = "zhangsan";
        final String pass = "123";
        new Thread() {
            @Override
            public void run() {
                try {
                    HttpPost post = new HttpPost("http://192.168.1.10:8080/server/login.jsp");
                    // 如果傳遞參數量大的話可以對傳遞參數進行封裝
                    List params = new ArrayList();
                    params.add(new BasicNameValuePair("name", name));
                    params.add(new BasicNameValuePair("pass", pass));                               
                    // 設置請求參數
                    post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 
                    // 發送POST請求
                    HttpResponse response = httpClient.execute(post); 
                    // 返回響應
                    if (response.getStatusLine().getStatusCode() == 200) {
                        String msg = EntityUtils.toString(response.getEntity());
                        Looper.prepare();
                        System.out.println(msg);
                        Looper.loop();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();  
    }
}

6.使用第三方網絡框架

(1)Android-async-http
(2)Afinal框架
(3)xUtils3框架

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved