1. 程式人生 > >Android客戶端與雲伺服器進行網路通訊

Android客戶端與雲伺服器進行網路通訊

多寫技術文件,多寫技術文件,多寫技術文件,重要的事情說三遍......

-------------------------------------------------------------------------------------------------------------------

功能需求:Android客戶端解析和顯示雲伺服器返回的xml檔案。

思路:涉及到Android端應用和Java ee端web應用的編碼實現。

示例:Android客戶端獲取騰訊雲伺服器上的視訊資訊

步驟:

1、開發環境部署

Java ee部分:

java+apache-tomcat-8.5.9-windows-x64+
Eclipse(for javaEE Developers版本)

android部分:

androidstudio整合開發工具

2、web應用部分開發

a、在Java ee下(安裝在本地筆記本端)新建“Dynamic Web Project”;

b、然後新建一個servlet,同時注意web.xml中的相關配置情況,截圖如下:

注:servlet是放在HTTP Web伺服器上面執行的Java程式。當用戶通過客戶端和伺服器互動時,請求(request)會送給web伺服器。如果請求需要Java的servlet時,伺服器會執行或呼叫已經執行的servlet程式程式碼。servlet只是在伺服器上執行的程式程式碼,執行使用者發出請求所要的結果。

c、其中servlet核心程式碼如下:

複製程式碼
public class ListServelet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       private VideoNewsService service=new VideoNewsServiceBean();
 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    
    }

    
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<News> videos = service.getLastNews(); request.setAttribute("videos", videos); request.getRequestDispatcher("/WEB-INF/page/videonews.jsp").forward(request, response); } }
複製程式碼  當用戶請求該路徑http://www.伺服器公網IP:8080/web專案名稱/ListServlet,其中ListServlet為建立的Servlet的名稱,這個servlet就要從資料庫中得到最新的視訊資訊,並且把資料封裝成一個xml資料返回給android客戶端。  d、先寫一個業務bean,這個業務bean用於從資料庫中得到最新的視訊資訊,在方法中不打算真正的訪問資料庫,這裡模擬一些測試資料進行返回,

新建一個javabean,程式碼如下:資訊id+標題+時長

複製程式碼
public class VideoNewsServiceBean implements VideoNewsService {
    public List<News> getLastNews(){
        List<News> newes = new ArrayList<News>();
        newes.add(new News(90, "喜羊羊與灰太狼全集", 78));
        newes.add(new News(10, "實拍艦載直升東海救援演習", 28));
        newes.add(new News(56, "喀麥隆VS荷蘭", 70));
        return newes;
    }
}
複製程式碼

在業務bean中定義一個方法返回一個集合,例如:News,集合存放了資料庫最新的視訊資訊,集合裡的元素型別採用一個javabean描述每一條視訊資訊。

複製程式碼
public class News {
    private Integer id;
    private String title;
    private Integer timelength;
    
    public News(Integer id, String title, Integer timelength) {
        this.id = id;
        this.title = title;
        this.timelength = timelength;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public Integer getTimelength() {
        return timelength;
    }
    public void setTimelength(Integer timelength) {
        this.timelength = timelength;
    }
}
複製程式碼

此外,Java ee是面向介面程式設計,將業務bean中的方法進行介面抽取,同時繼承實現這個介面中的方法。介面程式碼如下:

複製程式碼
public interface VideoNewsService {
    /**
     * 獲取最新的視訊資訊
     * @return
     */
    public List<News> getLastNews();

}
複製程式碼

e、 另外在表現層構造xml資料,在WebContent-WEB-INF下新建一個“page”資料夾,然後再新建一個jsp檔案,名稱“videonews”。contentType=“text/xml” ,程式碼如下:

複製程式碼
1 <%@ page language="java" contentType="text/xml; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><?xml version="1.0" encoding="UTF-8"?>
2 <videonews><c:forEach items="${videos}" var="video">
3     <news>
4         <id>${video.id}</id>
5         <title>${video.title}</title>
6         <timelength>${video.timelength}</timelength>
7     </news></c:forEach>
8 </videonews>
複製程式碼

其中xml資料的呈現形式可以在jsp檔案中進行定義,同時需要在lib檔案下新增第三方類庫jstl,如下:

f、在servlet中需要引入新建的jsp檔案,這樣才能自定義xml格式檔案,如下:

其中集合中的視訊資訊物件傳遞給jsp檔案,把物件放在request範圍給定key,接著把請求內部轉發給jsp。指定jsp檔案路徑。

g、在javaee下把應用部署到tomcat伺服器之後,在瀏覽器中輸入路徑:http://localhost:8080/videonews/ListServlet出現xml資料格式,證明web應用沒問題了,即從伺服器端返回了xml格式的資料並且顯示在螢幕上。

h、將web專案部署到騰訊雲伺服器上

第一步,在java ee中將web專案匯出,匯出為war格式;

第二步,將第一步匯出的war檔案放入騰訊雲伺服器Tomcat的webAPP目錄下,然後從bin---startup.bat啟動Tomcat,先在伺服器試試http://localhost:8080/專案名稱/ListServelet能否成功執行,可以的話,不要關閉伺服器的Tomcat,回到自己筆記本,在瀏覽器輸入http://伺服器公網IP:8080/專案名稱/ListServelet即可訪問雲伺服器web專案.

 3、Android部分開發

a、引入OkHttp來發送HTTP請求方式,在build.gradle新增OkHttp依賴檔案,如下: 

複製程式碼
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.0.1'
    testCompile 'junit:junit:4.12'
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
}
複製程式碼

 b、此外,android部分的核心是對xml資料進行解析,程式碼如下:

複製程式碼
 1 class VideoNewsService {
 2     /**
 3      * 獲取視訊資訊
 4      *
 5      * @return
 6      * @throws Exception
 7      */
 8     static  List<News> newses = new ArrayList<>();
 9     static List<News> sendRequestWithOkHttp() {
10         new Thread(new Runnable() {
11             @Override
12             public void run() {
13                 try {
14                     OkHttpClient client = new OkHttpClient();
15                     Request request = new Request.Builder()
16                             // 指定訪問的伺服器地址是電腦本機
17                             .url("http://雲伺服器公網IP:8080/VideoNews/ListServelet")
18                             .build();
19                     Response response = client.newCall(request).execute();
20                     String responseData = response.body().string();                   
21                     parseXML(responseData);
22                     
23                 } catch (Exception e) {                  
24                     e.printStackTrace();
25                 }
26             }
27         }).start();
28        return newses;
29     }
30 
31     private static List<News> parseXML(String xmlData) throws Exception {
32         News news = null;
33         XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
34         XmlPullParser parser = factory.newPullParser();
35         parser.setInput(new StringReader(xmlData));     
36         int event = parser.getEventType();
37         while (event != XmlPullParser.END_DOCUMENT) {          
38             switch (event) {
39                 case XmlPullParser.START_TAG:
40                   
41                     if ("id".equals(parser.getName())) {
42                         int id = Integer.valueOf(parser.nextText());
43                         news = new News();
44                         news.setId(id);                       
45                     } else if ("title".equals(parser.getName())) {
46                         news.setTitle(parser.nextText());
47                     } else if ("timelength".equals(parser.getName())) {
48                         news.setTimelength(Integer.valueOf(parser.nextText()));
49                     }
50                     break;
51 
52                 case XmlPullParser.END_TAG: {
53                     if ("news".equals(parser.getName())) {
54                         newses.add(news);
55                         news = null;
56                     }
57                     break;
58                 }
59                 default:
60                     break;
61             }
62             event = parser.next();
63         }       
64         return newses;
65     }
66 }
複製程式碼

News.java程式碼如下:

複製程式碼
 1 public class News {
 2     private Integer id;
 3     private String title;
 4     private Integer timelength;
 5     public News(){}
 6     public News(Integer id, String title, Integer timelength) {
 7         this.id = id;
 8         this.title = title;
 9         this.timelength = timelength;
10     }
11     public Integer getId() {
12         return id;
13     }
14     public void setId(Integer id) {
15         this.id = id;
16     }
17     public String getTitle() {
18         return title;
19     }
20     public void setTitle(String title) {
21         this.title = title;
22     }
23     public Integer getTimelength() {
24         return timelength;
25     }
26     public void setTimelength(Integer timelength) {
27         this.timelength = timelength;
28     }
29     
30 }
複製程式碼

MainActivty.class的核心程式碼如下:

複製程式碼
 1 public class MainActivity extends AppCompatActivity {
 2     /** Called when the activity is first created. */
 3     @Override
 4     public void onCreate(Bundle savedInstanceState) {
 5         super.onCreate(savedInstanceState);
 6         setContentView(R.layout.activity_main);
 7        
 8         ListView listView = (ListView) this.findViewById(R.id.listView);
 9        
10         try {
11             List<News> videos = VideoNewsService.sendRequestWithOkHttp();//需修改成你本機的Http請求路徑          
12             List<HashMap<String, Object>> data = new ArrayList<HashMap<String,Object>>();
13             for(News news : videos){
14                 HashMap<String, Object> item = new HashMap<String, Object>();
15                 item.put("id", news.getId());
16                 item.put("title", news.getTitle());
17                 item.put("timelength", getResources().getString(R.string.timelength)
18                         + news.getTimelength()+ getResources().getString(R.string.min));
19                 data.add(item);               
20             }
21             SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item,
22                     new String[]{"title", "timelength"}, new int[]{R.id.title, R.id.timelength});
23             listView.setAdapter(adapter);
24         } catch (Exception e) {
25             e.printStackTrace();           
26         }
27     }
28 }
複製程式碼

c、最終執行成功的效果圖,如下:

--------------------------------------------------------------------------------------------------------------------

參考資料:

http://www.cnblogs.com/diyunfei/p/6826557.html      //怎樣將本地web專案部署到騰訊雲伺服器上?

https://jingyan.baidu.com/article/3a2f7c2e62d25e26afd611fa.html     //WIN7系統JavaEE(java+tomcat7+Eclipse)環境配置