Android与服务器的简单通讯
来源:互联网 发布:凡科绑定域名 编辑:程序博客网 时间:2024/06/03 10:36
项目需要,兼职搞起了后台,完全木有学过,从头开始,一张白纸,整了很多弯路,随手记下一些知识,也许还会用得着...
环境:Ubuntu 14.04 + Eclipse-JEE-Luna + 红米1s(android 4.3)
服务端
创建项目
- 下载tomcat
安装版跟解压缩版本我试了都可以用,这里用后者,下完压缩包,解压即可,我都是懒得处理权限,所以解压到了home目录; - 在Eclipse中新建项目" web ==> dynamic web project",在下一步的"target runtime"中选择"new runtime",就有如下界面:
name随便起,然后选择刚才解压的tomcat目录,finish即可;
当然,runtime也可以通过" window ==> preferences ==> server ==> runtime"中进行创建/修改等操作;
最后,记得生成web.xml文件:
编写服务端处理程序
- 这里采用比较简单的servlet,架构如下:
a.所有请求均提交给分配类ActionDistribute;
b.分配类再根据请求信息中的命令编码int cmd,去调用相应的处理类,并返回String; - web.xml配置:
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><display-name>TestWebServer</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><!-- 配置以下内容 --><servlet><servlet-name>nihao</servlet-name> <!-- 名称随意,与mapping对应即可 --><servlet-class>org.lynxz.test.ActionDistribute</servlet-class> <!-- 完成的包名 + 类名 --></servlet><servlet-mapping><servlet-name>nihao</servlet-name> <!-- 与上面的name对应即可 --><url-pattern>/* </url-pattern> <!-- 访问网址,这里将任意请求都转发给统一处理类 --></servlet-mapping></web-app>
- ActionDistribute分配类:
package org.lynxz.test;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * @author lynxz * @date Sep 21, 2014 * 用于分类处理所有的客户端请求,通过提取请求码,转交给相应的程序 */public class ActionDistribute extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println("有新的get请求,将转交给doPost处理...");doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {System.out.println("有新的post请求需要处理");String resultJson = "";// 用于返回给客户端的json数据String actionType = req.getParameter("actionTypeCmd");if (actionType != null) {int actionCmd = Integer.valueOf(actionType);resultJson = GateWay.getResult(actionCmd, req);} else {resultJson = "{\"status\":\"fail\",\"msg\":\"error requet actionType\"}";}// 将结果返回给客户端PrintWriter out = resp.getWriter();out.write(resultJson);out.flush();out.close();}}
- GateWay网关分配类:
package org.lynxz.test;import javax.servlet.http.HttpServletRequest;import org.lynxz.processer.Hello;/** * @author lynxz * @date Sep 21, 2014 * 根据请求码分配处理程序,并返回结果String */public class GateWay {private static GeneralService service = null;public static String getResult(int actionCmd, HttpServletRequest req) {switch (actionCmd) {case 1:service = new Hello();break;default:break;}return service == null ? null : service.postBack();}}
- 通用返回接口GeneralService:
package org.lynxz.test;public interface GeneralService {public String postBack();}
- 具体的处理程序:
package org.lynxz.processer;import org.lynxz.test.GeneralService;/** * @author lynxz * @date Sep 21, 2014 * 实际处理客户端请求的具体程序 * 由于通讯传输的时候文本,所有程序均要返回String, * 因此抽象一个接口便于各个程序实现 */public class Hello implements GeneralService {@Overridepublic String postBack() {// json内容随意,与客户端配合来编写String json = "{\"status\":\"success\",\"msg\":\"hello client\"}";return json;}}
之后运行该项目:run as ==> run on server,即可在浏览器中看到结果:
网址最后面可以加任意字符,服务端创建到此告一段落;
客户端
客户端与服务器的通讯方法有多种,这里先记录的是AQuery,可参考此文,用到的query和gson库可以到网盘下载,Demo文件下载:Demo03:AQuery
- 新建项目,设置权限等操作就省略了,这里是调用到的方法是:
aq.ajax(String url, Map<String, ?> params, Class<TestEntity> type, Object handler, String callback)
- 客户端通过aquery将包含请求信息的map发送给url指向的服务器,服务器响应并返回json数据,客户端利用transformer及gson将gson解析成具体的类以方便客户端调用;
- AQuery的使用方法:
Map<String, String> params = null;
/* * 设置用于解析服务器返回值的转换类, * GsonTransformer实现了接口com.androidquery.callback.Transformer; */AbstractAjaxCallback.setTransformer(new GsonTransformer());AbstractAjaxCallback.setTimeout(3000);AQuery aq = new AQuery(this);params = new HashMap<String, String>();params.put("actionTypeCmd", "1");params.put("content", "hello");aq.ajax(url, params, TestEntity.class, this, "helloCallback");
其中"TestEntity"是自定义类,aq会将服务器返回的数据解析成该类,而"helloCallback"是回调方法,服务器返回或超时后进行调用,格式如下:public void helloCallback(String url, TestEntity json, AjaxStatus status) {......}
- 具体内容:
TestEntity类:package com.example.test;public class TestEntity {String status;String msg;public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}}
GsonTransformer类:package com.example.test;import com.androidquery.callback.AjaxStatus;import com.androidquery.callback.Transformer;import com.google.gson.Gson;/** * @author lynxz * @date Sep 21, 2014 * 用于将服务器返回的数据转换成本地类,便于调用 */public class GsonTransformer implements Transformer {Gson gson = new Gson();@Overridepublic <T> T transform(String url, Class<T> type, String encoding,byte[] data, AjaxStatus status) {System.out.println("从服务器获得的数据 = " + new String(data));return gson.fromJson(new String(data), type);}}
MainActivity类:package com.example.test;import java.util.HashMap;import java.util.Map;import android.app.Activity;import android.os.Bundle;import com.androidquery.AQuery;import com.androidquery.callback.AbstractAjaxCallback;import com.androidquery.callback.AjaxStatus;public class MainActivity extends Activity {private String url = "http://192.168.0.103:8080/TestWebServer/hello";private Map<String, String> params = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/* * 设置用于解析服务器返回值的转换类, * GsonTransformer实现了接口com.androidquery.callback.Transformer; */AbstractAjaxCallback.setTransformer(new GsonTransformer());AbstractAjaxCallback.setTimeout(3000);AQuery aq = new AQuery(this);params = new HashMap<String, String>();params.put("actionTypeCmd", "1");aq.ajax(url, params, TestEntity.class, this, "helloCallback");}public void helloCallback(String url, TestEntity json, AjaxStatus status) {System.out.println("进入回调方法");if (json != null) {System.out.println("status = " + json.getStatus());System.out.println("msg = " + json.getMsg());} else {System.out.println("json == null");}}}
0 0
- Android与服务器的简单通讯
- 简单的TCP服务器与客户端通讯
- android与服务器通讯方式
- Android模拟器与本地服务器的socket通讯
- 采用json格式进行服务器与android客户端的通讯
- Android开发中父类与子类通讯的一个简单实现
- android简单的socket通讯
- C# Scoket 简单的服务器客户端通讯
- android httpclient与javaweb服务器通讯
- Android使用webservice与服务器通讯
- Java实现简单的Socket服务器与客户端字符串通讯(适合初学者阅读)
- Java实现简单的Socket服务器与客户端字符串通讯(适合初学者阅读)
- Java实现简单的Socket服务器与客户端字符串通讯(适合初学者阅读)
- WFE与Index服务器之前的通讯
- 客户端与服务器通讯的类
- android的网络与通讯
- 浏览器与服务器通讯
- Android与服务器通讯:如何保证两端时间一致性
- Andorid中的控件属性
- 浅谈C中的malloc和free
- 怎么解决div覆盖内容却没覆盖的问题?
- Android通过ant脚本打包带Library project的方法
- cocos2d在Android上竖屏显示
- Android与服务器的简单通讯
- android一年来学习的总结---资源与站点篇
- 类的引用和复制
- django学习之二:django配置mysql
- 使用Crystal Report致使VS出现未响应或已停止工作问题
- 软件工程
- 从今天起,好好做一个程序猿
- VC上检测设备热插拔事件
- HDU_ACM-2019 数列有序