我的新书《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;
});
}