【实习周记】微信网络组件——腾讯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;//设置任务重试次数
发布了13 篇原创文章 · 获赞 5 · 访问量 3106

猜你喜欢

转载自blog.csdn.net/LeeDuoZuiShuai/article/details/104102091
今日推荐