Mars是腾讯的一款开源框架,主要用于网络请求中的长连接,短连接,是基于 socket 层的解决方案,在网络调优方面有更好的可控性,暂不支持HTTP协议。
注意:当前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作为模块,添加项目依赖。
在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();
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();
,确保连接上。
流程和长连接发送时相同,不同的地方在于创建任务。
1)创建任务
ArrayList<String> list = new ArrayList<>();
list.add("你的IP地址");
task = new StnLogic.Task(StnLogic.Task.EShort,1,"me",list);
2)开启任务
StnLogic.startTask(task);
在public int buf2Resp(int taskID, Object userContext, byte[] respBuffer, int[] errCode, int channelSelect)
方法下接收相应请求的返回消息,respBuffer为接收的数据。
在public void onPush(int cmdid, byte[] data)
方法下接受服务器主动发送的消息,data为接收的数据。
Mars框架会每隔一段时间向服务器发送长度为20的心跳包,确保链路可用,防止内网IP被回收。
默认情况下,当客户端发送请求时,首先会判断客户端是否具有权限,如果有,客户端会先发送请求,然后发送客户端的身份信息用于服务器校验,同时,需要服务器有响应,当服务器返回相应时,首先会接收服务器的身份信息,校验通过后,接收服务器返回的响应。
当服务器没有响应时,会触发超时重发机制,向服务器发送请求,当超过一定次数时会结束发送。
对应Stn.callback中的方法:
makesureAuthed() //权限判断
req2Buf() //发送请求
getLongLinkIdentifyCheckBuffer() //客户端发送的身份 ,心跳包发送后也会调用此方法
onLongLinkIdentifyResp() //服务器发送的身份
buf2Resp() //接收响应
当长连接获取不到IP地址时会调用onNewDns()
方法。
当短链接获取不到IP地址时会调用requestNetCheckShortLinkHosts()
方法。
当服务器主动发送消息时会调用onPush()
方法。
当任务结束时会调用onTaskEnd()
方法。
当产生数据变化时会调用trafficData()
方法。
通过以下操作可以避免Mars框架的一些机制。
在创建task后对task的参数进行修改:
task.needAuthed = false;//设为false,不会调用makesureAuthed()方法
task.sendOnly = true;//设为true,发送后不需要等待回包。
task.retryCount =0;//设置任务重试次数