騰訊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;//設置任務重試次數