Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> 巧用Android網絡通信技術實現在網絡上直接傳輸對象

巧用Android網絡通信技術實現在網絡上直接傳輸對象

編輯:Android開發實例

要做一個優秀的Android應用,使用到網絡通信技術是必不可少的,很難想象一款沒有網絡交互的軟件最終能發展得多成功。那麼我們來看一下,一般Android應用程序裡都是怎麼實現網絡交互的,這裡拿一個Boook對象為例:


 

如上圖所示,首先在手機端生成一個Book對象,裡面包含書名、作者、價格等數據。為了要將這些數據發送到服務器端,我們要從Book對象中把數據取出,然後組裝成XML格式的字符串。接著通過網絡API,把組裝好的XML字符串發送到服務器端。服務器端接到了客戶端發來的XML字符串,就要對該XML進行解析。然後把解析出的數據重新組裝成Book對象,之後服務器端就可以對該對象進行一系列其它的操作了。

當然XML格式的數據量比較大,現在很多Android應用為了節省流量,都改用JSON格式來傳輸數據了。不過不管是使用XML還是JSON,上圖中描述的步驟總是少不了的。

感覺使用這種方式來傳輸數據,每次封裝和解析XML的過程是最繁瑣的,那麼能不能把這最繁瑣的過程繞過去呢?


 

如上圖所示,如果可以調用網絡API,直接把Book對象發送到服務器端,那麼整個網絡交互過程就會變得非常簡單,下面我們就來看看如何實現。

新建一個Android工程,命名為ClientTest作為客戶端工程。這裡第一個要確定的就是待傳輸的對象,我們新建一個Book類,代碼如下:

  1. package com.test;  
  2.  
  3. import java.io.Serializable;  
  4.  
  5. public class Book implements Serializable {  
  6.  
  7.     private String bookName;  
  8.  
  9.     private String author;  
  10.  
  11.     private double price;  
  12.  
  13.     private int pages;  
  14.  
  15.     public String getBookName() {  
  16.         return bookName;  
  17.     }  
  18.  
  19.     public void setBookName(String bookName) {  
  20.         this.bookName = bookName;  
  21.     }  
  22.  
  23.     public String getAuthor() {  
  24.         return author;  
  25.     }  
  26.  
  27.     public void setAuthor(String author) {  
  28.         this.author = author;  
  29.     }  
  30.  
  31.     public double getPrice() {  
  32.         return price;  
  33.     }  
  34.  
  35.     public void setPrice(double price) {  
  36.         this.price = price;  
  37.     }  
  38.  
  39.     public int getPages() {  
  40.         return pages;  
  41.     }  
  42.  
  43.     public void setPages(int pages) {  
  44.         this.pages = pages;  
  45.     }  
  46.  
  47. }  
  48.  

這個類就是一個簡單的POJO,但是要注意一點,它實現了Serializable接口,如果想在網絡上傳輸對象,那麼該對象就一定要實現Serializable接口。

 

接下來打開或新建activity_main.xml作為程序的主布局文件,加入如下代碼:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     xmlns:tools="http://schemas.android.com/tools" 
  3.     android:layout_width="match_parent" 
  4.     android:layout_height="match_parent" 
  5.     android:background="#000" 
  6.     tools:context=".MainActivity" > 
  7.  
  8.    <Button   
  9.      android:id="@+id/send"    
  10.      android:layout_width="fill_parent" 
  11.      android:layout_height="wrap_content" 
  12.      android:text="發送" 
  13.      /> 
  14.  
  15. </RelativeLayout> 

這個布局裡面就是包含了一個按鈕,點擊這個按鈕就去發出網絡請求。

 

接下來打開或新建MainActivity作為程序的主Activity,其中加入如下代碼:

  1. public class MainActivity extends Activity implements OnClickListener {  
  2.  
  3.     private Button send;  
  4.  
  5.     @Override 
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_main);  
  9.         send = (Button) findViewById(R.id.send);  
  10.         send.setOnClickListener(this);  
  11.     }  
  12.  
  13.     @Override 
  14.     public void onClick(View v) {  
  15.         Book book = new Book();  
  16.         book.setBookName("Android高級編程");  
  17.         book.setAuthor("Reto Meier");  
  18.         book.setPages(398);  
  19.         book.setPrice(59.00);  
  20.         URL url = null;  
  21.         ObjectOutputStream oos = null;  
  22.         try {  
  23.             url = new URL("http://192.168.1.103:8080/ServerTest/servlet/TestServlet");  
  24.             HttpURLConnection connection = (HttpURLConnection) url.openConnection();  
  25.             connection.setDoInput(true);  
  26.             connection.setDoOutput(true);  
  27.             connection.setConnectTimeout(10000);  
  28.             connection.setReadTimeout(10000);  
  29.             connection.setRequestMethod("POST");  
  30.             oos = new ObjectOutputStream(connection.getOutputStream());  
  31.             oos.writeObject(book);  
  32.             InputStreamReader read = new InputStreamReader(connection.getInputStream());  
  33.             BufferedReader br = new BufferedReader(read);  
  34.             String line = "";  
  35.             while ((line = br.readLine()) != null) {  
  36.                 Log.d("TAG", "line is " + line);  
  37.             }  
  38.             br.close();  
  39.             connection.disconnect();  
  40.         } catch (Exception e) {  
  41.             e.printStackTrace();  
  42.         } finally {  
  43.  
  44.         }  
  45.     }  
  46.  
  47. }  
  48.  


我們可以看到,在onClick方法中處理了按扭的點擊事件。這裡首先new出了一個Book對象作為待傳輸數據,接著new出了一個URL對象,指明了服務器端的接口地址,然後對HttpURLConnection的一些可選參數進行配置。接著通過調用ObjectOutputStream的writeObject方法,將Book對象發送到服務器端,然後等服務器端返回數據,最後關閉流和連接。

 

注意由於我們使用了網絡功能,因此需要在AndroidManifest.xml中加入如下權限:

  1. <uses-permission android:name="android.permission.INTERNET" /> 

好了,目前Android端的代碼已經開發完成,我們現在開始來編寫服務器端代碼。

 

新建一個名為ServerTest的Web Project,要做的第一件事就在Web Project下建立一個和Android端一樣的Book類。這裡有個非常重要的點大家一定要注意,服務器端的Book類和Android端的Book類,包名和類名都必須相同,否則會出現類型轉換異常。這裡由於兩個Book類的內容是完全一樣的,我就不再重復貼出。

然後新建一個Java Servlet作為網絡訪問接口,我們重寫它的doPost方法,具體代碼如下:

  1. public class TestServlet extends HttpServlet {  
  2.  
  3.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  4.             throws ServletException, IOException {  
  5.         ObjectInputStream ois = null;  
  6.         try {  
  7.             ois = new ObjectInputStream(request.getInputStream());  
  8.             Book book = (Book) ois.readObject();  
  9.             System.out.println("書名是: " + book.getBookName());  
  10.             System.out.println("作者是: " + book.getAuthor());  
  11.             System.out.println("價格是: " + book.getPrice());  
  12.             System.out.println("頁數是: " + book.getPages());  
  13.             PrintWriter out = response.getWriter();  
  14.             out.print("success");  
  15.             out.flush();  
  16.             out.close();  
  17.         } catch (Exception e) {  
  18.             e.printStackTrace();  
  19.         } finally {  
  20.             ois.close();  
  21.         }  
  22.     }  
  23.       
  24. }  

可以看到,我們首先通過調用HttpServletRequest的getInputStream方法獲取到輸入流,然後將這個輸入流組裝成ObjectInputStream對象。接下來就很簡單了,直接調用ObjectInputStream的readObject方法,將網絡上傳輸過來的Book對象獲取到,然後打印出Book中攜帶的數據,最後向客戶端返回success。

 

現在我們來運行一下程序,首先將ServerTest這個項目布置到服務器上,並開啟服務器待命。接著在手機上打開ClientTest這個應用程序,如下圖所示:

                            
 

點擊發送發出網絡請求,可以看到服務器端打印結果如下:


 

而Android端打印結果如下:


 

由此我們可以看出,網絡上進行對象傳輸已經成功了!不需要通過繁瑣的XML封裝和解析,我們也成功將Book中的數據完整地從Android端發送到了服務器端。

好了,今天的講解到此結束,有疑問的朋友請在下面留言。

源碼下載,請點擊這裡
 

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