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格式的数据并且显示在屏幕上。

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)环境配置

时间: 2024-10-13 16:14:58

Android客户端与云服务器进行网络通信的相关文章

Android客户端与PC服务器通过socket进行交互实例(转)

一直以来对Android socket通信都很模糊,今天终于研究了一个网上的例子,自己又修改了下,算是对Android socket通信有点了解了. 下面是具体的代码,说明都在注释中了.需要注意的是,只有客户端发送了信息给服务器后,服务器才能响应客户端的输入,然后返回信息给客户端,这是客户端才能读取服务器返回的信息.如果客户端和服务器都处于等待对方的信息,那样就会造成阻塞,导致ANR了. 1.服务器端代码,就是一个java程序,与android无关,运行于服务器上,即PC机上. [java] v

Android客户端与本地服务器Socket通信

Android客户端与本地服务器Socket通信 Socket服务器运行结果图?? 一.客户端和服务器端的选择: 客户端是我们手机端,关于服务器端,只要安装了JDK,自然就拥有通讯的功能,我们只需要在Eclipse或者MyEclipse中写好文章中服务器端的代码,运行起来即可,用accept()方法启动服务器端,等待客户端的连接,在未连接的情况下,服务器端处于堵塞的状态. 二.客户端注意事项 andriod客户端添加网络访问权限 <uses-permission android:name="

Android客户端与Java服务器交互数据(二)阿里云ACE服务器搭建

前段时间写了一个新浪SAE部署代码的小总结,刚好今天阿里云云引擎ACE公测的审核资格通过了,就来对比一下ACE与新浪SAE的使用. 首先是账号,ACE作为阿里产品自然可以通过淘宝账号直接登录,而SAE则可以通过微博账号登录. http://www.aliyun.com/ 阿里云的主营业务比较多,主页很花哨,点击右上角的"管理控制台",然后进入"云引擎ACE",创建应用环境: 这里先写一个简单的JSP工程作为演示,打开Eclipse for JavaEE,然后File

通过android 客户端上传图片到服务器

昨天,(在我的上一篇博客中)写了通过浏览器上传图片到服务器(php),今天将这个功能付诸实践.(还完善了服务端的代码) 不试不知道,原来通过android 向服务端发送图片还真是挺麻烦的一件事. 上传代码: /* 上传文件至Server的方法 */ private void uploadFile() { String end = "\r\n"; String twoHyphens = "--"; String boundary = "*****"

Android客户端与Java服务器交互数据(一)SAE服务器搭建

平时大家的测试服务器都是运行在自己的PC上面,用Tomcat或者IIS搭建的本机服务器.其实新浪云平台SinaAppEngine也是挺好用的.今天总结一下我使用过程中的一些小心得: 1.创建SAE应用: 登陆http://sae.sina.com.cn/进行注册,微博帐号可以直接登陆.注册成功后进入"我的首页",控制台>应用管理>创建新应用 然后输入二级域名(应用的唯一标示),应用名称和其他信息,最后选择开发语言,这里以Java为例: JVM级别选择"经济版&qu

SSH服务器与Android通信(3)--Android客户端发送数据

Android客户端向SSH服务器发送数据主要有三种情况:通过客户端删除数据.添加数据和修改数据. 1.删除数据 先看看jsp文件里面是怎样删除数据的: <td align="center"><a href="clasdelete.action?id=<s:property value='#st.id'/>" onclick="if(!window.confirm('是否删除'))return false;" >

Android客户端与服务器交互方式-小结

最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json.要在Android手机客户端与pc服务器交互,需要满足下面几种条件:跨平台.传输数据格式标准.交互方便. 为了与服务器通讯其实无非就两种协议HTTP和TCP,TCP的学习Socket,HTTP的话熟悉一下HTTP协议和相关Java API.而下面的几种方式就是从这两种协议扩展出来的:webservices soap.SSH的JSON(可参考:该链接

Socket 通信原理(Android客户端和服务器以TCP&amp;&amp;UDP方式互通)

ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当,还望指教. 一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是s

使用HttpURLConnection实现在android客户端和服务器之间传递对象

一般情况下,客户端和服务端的数据交互都是使用json和XML,相比于XML,json更加轻量级,并且省流量,但是,无论我们用json还是用xml,都需要我们先将数据封装成json字符串或者是一个xml字符串然后传输,那么有没有可能我们直接在android客户端上传递一个Object给服务器端呢?答案是肯定的. 我们看一个简单的App注册页面,如下图: 当我们点击注册按钮的时候,将用户的注册信息通过一个Object对象传递到服务器,好,下来我们看看怎么样来传递对象: 首先我们要把用户的注册信息封装