时人不识凌云木,直待凌云始道高。这篇文章主要讲述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); }}
当用户请求该路径
文章图片
f、在servlet中需要引入新建的jsp文件,这样才能自定义xml格式文件,如下:
【Android客户端与云服务器进行网络通信】
文章图片
其中集合中的视频资讯对象传递给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*/ 8staticList< News> newses = new ArrayList< > (); 9static List< News> sendRequestWithOkHttp() { 10new Thread(new Runnable() { 11@Override 12public void run() { 13try { 14OkHttpClient client = new OkHttpClient(); 15Request request = new Request.Builder() 16// 指定访问的服务器地址是电脑本机 17.url("http://云服务器公网IP:8080/VideoNews/ListServelet") 18.build(); 19Response response = client.newCall(request).execute(); 20String responseData = https://www.songbingjia.com/android/response.body().string(); 21parseXML(responseData); 22 23} catch (Exception e) { 24e.printStackTrace(); 25} 26} 27}).start(); 28return newses; 29} 30 31private static List< News> parseXML(String xmlData) throws Exception { 32News news = null; 33XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 34XmlPullParser parser = factory.newPullParser(); 35parser.setInput(new StringReader(xmlData)); 36int event = parser.getEventType(); 37while (event != XmlPullParser.END_DOCUMENT) { 38switch (event) { 39case XmlPullParser.START_TAG:
40
41if ("id".equals(parser.getName())) { 42int id = Integer.valueOf(parser.nextText()); 43news = new News(); 44news.setId(id); 45} else if ("title".equals(parser.getName())) { 46news.setTitle(parser.nextText()); 47} else if ("timelength".equals(parser.getName())) { 48news.setTimelength(Integer.valueOf(parser.nextText())); 49} 50break; 51 52case XmlPullParser.END_TAG: { 53if ("news".equals(parser.getName())) { 54newses.add(news); 55news = null; 56} 57break; 58} 59default: 60break; 61} 62event = parser.next(); 63} 64return newses; 65} 66 }
News.java代码如下:
1 public class News { 2private Integer id; 3private String title; 4private Integer timelength; 5public News(){} 6public News(Integer id, String title, Integer timelength) { 7this.id = id; 8this.title = title; 9this.timelength = timelength; 10} 11public Integer getId() { 12return id; 13} 14public void setId(Integer id) { 15this.id = id; 16} 17public String getTitle() { 18return title; 19} 20public void setTitle(String title) { 21this.title = title; 22} 23public Integer getTimelength() { 24return timelength; 25} 26public void setTimelength(Integer timelength) { 27this.timelength = timelength; 28} 29 30 }
MainActivty.class的核心代码如下:
1 public class MainActivity extends AppCompatActivity { 2/** Called when the activity is first created. */ 3@Override 4public void onCreate(Bundle savedInstanceState) { 5super.onCreate(savedInstanceState); 6setContentView(R.layout.activity_main); 7 8ListView listView = (ListView) this.findViewById(R.id.listView); 9 10try { 11List< News> videos = VideoNewsService.sendRequestWithOkHttp(); //需修改成你本机的Http请求路径 12List< HashMap< String, Object> > data = https://www.songbingjia.com/android/new ArrayList< HashMap< String,Object> > (); 13for(News news : videos){ 14HashMap< String, Object> item = new HashMap< String, Object> (); 15item.put("id", news.getId()); 16item.put("title", news.getTitle()); 17item.put("timelength", getResources().getString(R.string.timelength) 18+ news.getTimelength()+ getResources().getString(R.string.min)); 19data.add(item); 20} 21SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item, 22new String[]{"title", "timelength"}, new int[]{R.id.title, R.id.timelength}); 23listView.setAdapter(adapter); 24} catch (Exception e) { 25e.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)环境配置
推荐阅读
- android-pulltorefresh下拉载入中使用gif动图
- Android自适应屏幕分辨率与国际化
- 第一篇Android Supersu 权限管理定制,隐藏过滤权限,指定APP最高权限
- Android在onCreate()方法中动态获取TextView控件的高度
- Android学习笔记- ButterKnife 8.0注解使用介绍
- Android 推断程序在手机中是否是活动状态或者正在执行状态
- Android之在Dialog中加入单选button自己定义Dialog
- 在内网使用Gradle构建Android Studio项目
- Android LBS 学习总结