【實習週記】微信網絡組件——騰訊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 篇原創文章 · 獲贊 6 · 訪問量 9263
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章