App使用Mars和Protocol Buffer实现长连接

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情

简介

mars官网: https://github.com/Tencent/mars

Mars 是微信官方的终端基础组件, 是一个业务性无关,平台性无关 使用C++ 编写的基础组件。目前已接入微信
Android、iOS、Mac、Windows、WP、UWP 等客户端。注意:目前仅支持Android、iOS、Mac、Windows
平台,其他平台会在后续的版本中很快支持。

为什么使用mars,下面是官网的介绍:
在这里插入图片描述
可以看出,mars是基于socket层结合移动端app设计的网络解决方案。由于移动端app会面临较多弱网以及各种各样复杂网络变化的场景,mars团队针对网络层做了大量优化,并且在微信这个亿级app上得以应用和验证。

所以,如果我们的产品是app,也就是面向移动端网络的用户,那么mars是一个很好的选择;
如果我们的产品需要使用到完整的http协议,那么可以选择使用OkHttp解决方案。

使用

android客户端具体接入mars可以参考mars官网的接入手册,在此不详细描述。
这里主要介绍一下接入mars后在开发过程中如何使用的问题。

.proto

关于protocol buffer,这里简单介绍一下:

Protocol Buffer 和 XML、JSON一样都是结构数据序列化的工具,但它们的数据格式有比较大的区别:

首先,Protocol Buffer 序列化之后得到的数据不是可读的字符串,而是二进制流

其次,XML 和 JSON格式的数据信息都包含在了序列化之后的数据中,不需要任何其它信息就能还原序列化之后的数据;但使用 Protocol Buffer 需要事先定义数据的格式(.proto 协议文件),还原一个序列化之后的数据需要使用到这个定义好的数据格式

最后,在传输数据量较大的需求场景下,Protocol Buffer 比 XML、JSON 更小(3到10倍)、更快(20到100倍)、使用维护更简单;而且 Protocol Buffer 可以跨平台、跨语音使用

首先需要建立.proto文件,内容样式如下:

syntax = "proto3";
import "header.proto";

package tiny.matchserver;

// 匹配请求
message SendCallReq{
	int32   sex = 1;        							// 性别 0:男 1:女
	int32   matchSex = 2; 							// 目标匹配性别 0:男:1:女
	string   city = 3;   									// 城市
	map<string, string> userFavTag = 4;  //用户喜好标签
	string version = 5; 								//当前app版本号
}

自动生成java文件

将.proto文件放入工程里面,build一下,IDE会帮助我们自动生成相关的Java文件,可以在build --> generated -> source -> proto目录下面看到这些生成的文件。
这些文件是根据我们放入的.proto文件自动生成的,比如:

package tiny.callserver;

public final class Callserver {
  private Callserver() {}
  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistryLite registry) {
  }
  public interface SendCallReqOrBuilder extends
      // @@protoc_insertion_point(interface_extends:tiny.matchserver.SendCallReq)
      com.google.protobuf.MessageLiteOrBuilder {

........
}

android调用

上面准备工作做好后,接下来就可以直接在我们业务代码里面调用了:

public void sendCall(int sex, int matchSex, String city, Map<String, String> userFavTag) {
        if (!SignalNetworkService.getInstance().isLongLinkAuthed()) {
            LogUtil.i(TAG, "<Calling> startCalling ======== isLongLinkAuthed:false");
            return;
        }
        Callserver.SendCallReq req = Callserver.SendCallReq.newBuilder()
                .setMatchSex(matchSex)
                .setCity(city)
                .setSex(sex)
                .setVersion(ContextUtil.getAppVersion())
                .build();
        LogUtil.i(TAG, "<Calling> sendCall<request> sex:" + sex + ", matchSex:"
                + matchSex + ", city:" + city);
        //Mars组包
        SignalNetworkManger.getInstance().sendRequest(1,
                "tiny.callserver.CallServantObj", "SendCall", req.toByteArray(),
                null, data -> {
                    int retCode = -2;
//                        LogUtil.i(TAG, "Calling ======== onSignalResponse");
                    if (data == null) {
                        return retCode;
                    }

                    try {
                        Callserver.SendCallResp resp = Callserver.SendCallResp.parseFrom(data);
                        // resonse响应处理
                        .......
                        ......
                   		return retCode;
                });
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值