【实习周记】微信网络组件——腾讯Mars框架的原理、编译和使用

腾讯Mars框架的原理、编译和使用

    Mars是腾讯的一款开源框架,主要用于网络请求中的长连接,短连接,是基于 socket 层的解决方案,在网络调优方面有更好的可控性,暂不支持HTTP协议。

一.Mars的编译

注意:当前Mars的主分支master版本为v1.2.2,而最新release包和相关文档为v1.3.0,V1.2.2版本的Mars编译Android的sdk有问题,所以,需要下载版本v1,3,0。

    1.在GitHub上下载Mars
    2.下载完成后,按照接入要求安装NDK 16 , Python 2.7, cmake , Cygwin。
    3.执行build_android.py脚本,输入23,打包so库。
在这里插入图片描述
    4.完成后在\mars-1.3.0\mars\libraries\mars_android_sdk\libs\armeabi目录下生成三个.so库。
在这里插入图片描述
    在\mars-1.3.0\mars\libraries\mars_android_sdk\src目录下为相应的Java文件。
在这里插入图片描述
    5.把它们配置到项目里,也可以把mars_android_sdk作为模块,添加项目依赖。

二.Mars的使用

1.初始化Mars

    在activity的onCreate()方法加入如下代码

//设置mars回调接口实例,mars回调上层时会调用该实例的方法
AppLogic.setCallBack(stub);
//初始化网络层回调实例 App实现NetworkCallBack接口
StnLogic.setCallBack(stub);
//设置信令探测回调实例,探测结果将通过该实例通知上层
SdtLogic.setCallBack(stub);

// APP创建时初始化平台回调 必须在onCreate方法前调用,
Mars.init(getApplicationContext(), new Handler(Looper.getMainLooper()));

// 设置长连接默认的host和端口
StnLogic.setLonglinkSvrAddr(profile.longLinkHost(), profile.longLinkPorts());
//设置短链接默认的端口
StnLogic.setShortlinkSvrAddr(profile.shortLinkPort());
//设置客户端版本 放入长连私有协议头部
StnLogic.setClientVersion(profile.productID());
//初始化Mars,APP启动时首次调用onCreate前必须显示调用 init方法
Mars.onCreate(true);
//设置Mars为前台状态,若应用变为后台,需设置false。以执行不同的网络连接策略
BaseEvent.onForeground(true);
//检测长链接状态.如果没有连接上,则会尝试重连
StnLogic.makesureLongLinkConnected();

2.通过长连接发送消息

    1)创建任务

StnLogic.Task task = new StnLogic.Task(StnLogic.Task.ELong,5,"",null);

    2)开启任务

StnLogic.startTask(task);

    Mars会自动启动任务,同时回调StnLogic.ICallBack中的
public boolean req2Buf(int taskID, Object userContext, ByteArrayOutputStream reqBuffer, int[] errCode, int channelSelect)方法。
    我们可以通过taskID来判断是哪一个任务,向reqBuffer写入数据,最后返回值修改为true,代表发送成功。
    注意:在使用长连接向reqBuffer写入数据前调用StnLogic.makesureLongLinkConnected();,确保连接上。

3.使用短链接发送

    流程和长连接发送时相同,不同的地方在于创建任务。
    1)创建任务

ArrayList<String> list = new ArrayList<>();
list.add("你的IP地址");
task = new StnLogic.Task(StnLogic.Task.EShort,1,"me",list);

    2)开启任务

StnLogic.startTask(task);

4.接收相应请求的返回消息

    在public int buf2Resp(int taskID, Object userContext, byte[] respBuffer, int[] errCode, int channelSelect)方法下接收相应请求的返回消息,respBuffer为接收的数据。

5.接收服务端发送的消息

    在public void onPush(int cmdid, byte[] data)方法下接受服务器主动发送的消息,data为接收的数据。

三.Mars的原理

1.Mars工作机制

    Mars框架会每隔一段时间向服务器发送长度为20的心跳包,确保链路可用,防止内网IP被回收。
    默认情况下,当客户端发送请求时,首先会判断客户端是否具有权限,如果有,客户端会先发送请求,然后发送客户端的身份信息用于服务器校验,同时,需要服务器有响应,当服务器返回相应时,首先会接收服务器的身份信息,校验通过后,接收服务器返回的响应。
    当服务器没有响应时,会触发超时重发机制,向服务器发送请求,当超过一定次数时会结束发送。

2.Mars代码中对应的方法

    对应Stn.callback中的方法:

makesureAuthed() //权限判断
req2Buf() //发送请求
getLongLinkIdentifyCheckBuffer() //客户端发送的身份 ,心跳包发送后也会调用此方法
onLongLinkIdentifyResp() //服务器发送的身份
buf2Resp() //接收响应

    当长连接获取不到IP地址时会调用onNewDns()方法。
    当短链接获取不到IP地址时会调用requestNetCheckShortLinkHosts()方法。
    当服务器主动发送消息时会调用onPush()方法。
    当任务结束时会调用onTaskEnd()方法。
    当产生数据变化时会调用trafficData()方法。

3.避免Mars的机制

    通过以下操作可以避免Mars框架的一些机制。
    在创建task后对task的参数进行修改:

task.needAuthed = false;//设为false,不会调用makesureAuthed()方法
task.sendOnly = true;//设为true,发送后不需要等待回包。
task.retryCount =0;//设置任务重试次数
Mars微信官方的终端基础组件,是一个使用 C 编写的业务性无关、平台性无关的基础组件。目前已接入微信 Android、iOS、Mac、Windows、WP 等客户端。主要包括以下几个部分:COMM:基础库,包括socket、线程、消息队列、协程等基础工具;XLOG:通用日志模块,充分考虑移动终端的特点,提供高性能、高可用、安全性、容错性的日志功能;SDT:网络诊断模块;STN:信令传输网络模块(核心模块),负责终端与服务器的小数据信令通道。包含了微信终端在移动网络上的大量优化经验与成果,经历了微信海量用户的考验。Mars 最早起源于微信的实际发展需要。由于微信多平台、亿级用户,微信基础功能的修改影响重大。但不同平台不同的实现导致众多平台上很难统一,一方面不利于质量把关,可能存在重大隐患,一方面也不利于微信对基础研究的深入。因此,微信开始了跨平台基础组件的开发,并且在微信中沉淀多年。随着基础组件的发展与稳定,他们希望通过开源的力量进一步的提升微信的基础,并且也期待行业的互相交流与促进,因此启动了Mars项目。微信网络层设计到很多不同的业务,在微信使用到的绝大部分功能,都是基于Mars提供的网络组件,包括文本消息、语音消息、朋友圈等核心功能。只有少部分业务不在范围内,例如VOIP、Webview等。微信使用到的网络服务,大体分为两种类型:信令网络、数据网络。其中STN负责信令网络,CDN组件则负责数据网络。但由于CDN涉及到腾讯内部的CDN服务,因此在Mars的开源列表中并没有包含CDN部分。SDT网络诊断模块提供了最基础的检测能力,需要由使用者自己组合使用。各个平台的Reachability API能反映的情况有局限,无法应对复杂的网络诊断,事实上有一些开源项目就是为了替换系统API。微信由于自身特点对网络诊断要求很高,因此将它作为基础的跨平台组件进行开发维护。STN是微信的信令传输网络,也可以认为是小数据传输网络,是微信日常中使用最频繁的网络通道。在开源设计上,STN抽象了微信使用模型,使得STN成为业务无关的网络通道,并且应用到了包括微信在内的多个腾讯内部应用中。与AFNetworking、Retrofit、Okhttp等框架不同,STN不仅是跨平台的网络解决框架,更是着重了“移动互联网“这一特点,结合移动互联网的不稳定特性,做了大量的优化工作,并且这些优化都是经过了微信长时间的验证和使用的。除此之外,STN中还包含了很多其他方面的实用设计,包括自定义DNS、容灾设计、负载考量、APP的前后台考量、休眠机制考量、省电机制等等。STN 比其它网络框架提供更多的功能:数据监控:STN提供了许多数据回调接口,使得应用可以基于这些网络数据,建立统计分析、监控等工具来管理应用的实际网络情况;问题定位:STN中含有很多关键日志,并且日志的设计已经帮助微信定位了很多的网络层问题。结合Mars提供的XLOG日志机制,应用可以运行时也打开日志,非常方便定位;参数配置:STN中将很多参数抽离为配置,使得应用可以根据自己的情况进行修改。网络通道上,目前STN提供了长连、短连两种类型的通道,用于满足不同的需求。使用STN后,应用开发者只需关注业务开发。移动互联网的各种“坑”则可以交由STN帮你处理。 标签:腾讯  微信
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值