当前位置:首页 > 行业动态 > 正文

Android客户端与服务器交互,如何实现高效通信?

Android客户端通过HTTP或HTTPS协议与服务器进行数据交互,使用JSON或XML格式传输信息。

Android客户端和服务器交互

Android客户端与服务器交互,如何实现高效通信?  第1张

一、基本概念与通信方式

通信方式

Android客户端与服务器之间的通信主要通过HTTP和Socket两种方式实现,HTTP是基于请求—响应模式的协议,适用于不需要时刻保持连接的场景,如客户端资源的获取、文件上传等,而Socket则提供了更低层次的通信能力,通过建立socket连接,双方可以开始持续的数据交换,适用于需要实时通讯的应用,比如即时通讯工具(如QQ、微信)、聊天室等。

1.1 HTTP通信

HTTP通信采用“请求—响应”的方式,即客户端向服务器发送一条HTTP请求,服务器收到请求后解析并返回数据给客户端,然后客户端再对这些数据进行解析和处理,HTTP基于TCP协议,保证了数据传输的可靠性。

1.2 Socket通信

Socket通信在程序内部提供了与外界通信的端口,通过建立socket连接,可为通信双方提供数据传输通道,Socket的主要特点包括数据丢失率低、使用简单且易于移植,它类似于peer to peer的连接,一方可以随时向另一方发送数据。

数据交互方式

Android客户端与服务器的数据交互方式主要有以下几种:

2.1 数据流

从web服务器响应到手机终端的数据一般打包在一个字节数组中,客户端采取Java数据流和过滤流的方式从字节数组中取出各种类型的数据,这种方式扩展了Android平台在访问Web服务器进行交互时的解析数据能力,但在实际项目中应用较少。

2.2 XML

XML是WebService的标准数据格式,具有良好的可读性和跨平台性,但数据量较大,传输效率相对较低。

2.3 Protocol Buffers

Protocol Buffers是一种轻便高效的结构化数据存储格式,支持跨平台,适合做数据存储或RPC数据交换格式,其最大优点是传输时数据体积可以压缩得很小,传输效率高。

2.4 JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,它是目前最常用于Android客户端与服务器交互的数据格式。

二、RESTful API的使用

RESTful API简介

RESTful是目前最流行的API设计规范,用于Web数据接口的设计,其核心原则是面向资源(URI),行为(GET / POST / PUT / PATCH / DELETE)与资源(URI)分离,更轻量级;数据描述简单,使用JSON、XML、Protocol Buffers即可全覆盖,主要使用JSON。

HTTP请求方式

GET:读取(Read)

POST:新建(Create)

PUT:更新(Update),通常是全部更新

PATCH:更新(Update),通常是部分更新

DELETE:删除(Delete)

项目搭建初期,客户端和服务器一般用GET和POST方式进行交互,随着业务演进和技术规范迭代,后期会采用上述五种方式来设计服务器接口,相应地,移动端的请求方式也得与之对应。

三、JSON数据交互实际应用

JSON数据类型

JSON的值只有六种数据类型:

Number:整数或浮点数

String:字符串

Boolean:true 或 false

Array:数组包含在方括号[]中

Object:对象包含在大括号{}中

Null:空类型

需要注意的是,传输的数据类型不能超过这六种,不能用Date数据类型,不同的解析库解析方式不同,可能会导致异常,如果遇到日期的数据,最好的方式就是使用毫秒数表示日期。

String数据类型

使用场景:如用户退出登录时,只需要得到返回状态和提示信息即可,不需要返回任何数据。

{
    "code": 1000,
    "message": "成功"
}

数据解析工具类:

abstract class BaseStringCallback: BaseCallback() {
    override fun onSuccess(data: String) {
        val responseData = JSONObject(data)
        val code = responseData.getInt("code")
        val message = responseData.getString("message")
        if (code == 1000) {
            success(message)
        } else {
            //其他状态
        }
    }
    abstract fun success(msg: String)
}

调用时(伪代码):

LogoutApi.execute(object : BaseStringCallback() {
    override fun success(msg: String) {
        //处理数据
    }
})

Object数据类型

识别标示为:{}

使用场景:如获取当前用户信息,返回owner实体类,这个类我们可以直接用Gson的工具类转换为owner实体类。

{
    "code": 1000,
    "message": "成功",
    "resp": {
        "owner": {
            "id": 58180,
            "name": "张三",
            "idCert": "",
            "certType": 1,
            "modifier": "jun5753",
        }
    }
}

数据解析工具类:

class GsonUtils {
    static fun <T> fromJson(json: String, clazz: Class<T>): T? {
        return try {
            Gson().fromJson(json, clazz)
        } catch (e: Exception) {
            null
        }
    }
}

调用时(伪代码):

val result = GsonUtils.fromJson(response, Owner::class.java)
if (result != null) {
    //处理数据
}

四、实际案例分析:登录功能实现

服务器端实现

服务器端接收客户端发送的账号和密码,查询数据库判断是否能登录成功,然后返回JSON字符串给客户端,服务器端可以使用SpringBoot+Mybatis-Plus快速搭建。

@PostMapping("/login")
public Map<String, Object> login(@RequestBody User user) {
    Map<String, Object> map = new HashMap<>();
    if(userMapper.selectOne(new QueryWrapper<>(user)) != null){
        map.put("msg","登录成功");
    }else {
        map.put("msg","账号或密码错误");
    }
    return map;
}

Android客户端实现

Android客户端输入账号和密码,使用OkHttp向服务器端发送请求并传递输入的账号和密码,服务器端的登录接口查询数据库,判断是否能登录成功,然后返回给客户端JSON字符串,客户端使用Gson解析服务器返回的数据,做出不同的操作。

private void login(String name, String pwd, MyCallBack myCallBack) {
    RequestParams params = new RequestParams();
    params.add("name", name);
    params.add("pwd", pwd);
    x.post("http://192.168.31.220:8080/AndroidServer/app/login", params, new Callback.CommonCallback<String>() {
        @Override
        public void onSuccess(String result) { // success
            //处理返回结果
            L.d("tag", "result===" + result); //{"code":1000,"message":"登录成功"}
            try {
                JSONObject object = new JSONObject(result);
                int code = object.getInt("code");
                String msg = object.getString("message");
                myCallBack.onSuccess(code, msg);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void onError(Throwable ex, boolean isOnCallback) { // failure
            //请求失败处理
            ex.printStackTrace();
            myCallBack.onError("请求失败");
        }
    });
}

以上就是关于“android客户端和服务器交互”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!

0