91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

源碼分析系列之PomeloForEgret

發布時間:2020-06-04 05:13:14 來源:網絡 閱讀:445 作者:firekido 欄目:游戲開發

在我上一個手游項目中,前端使用的是白鷺引擎,后端使用的框架是pomelo,前端使用的網絡庫是pomelo提供給白鷺的,可以在git上拿到這份源代碼,或者應該pomelo的官網也可以找到。

本文是對這份PomeloForEgret源碼的分析。一個完整的客戶端網絡庫應該包括初始化,握手,發送心跳包,協議數據的發送和接收。PomeloForEgret基于websocket,完整的包含了上述的功能,數據的發送和接收同時支持json數據和根據protobuf數據結構協議序列化的二進制數據。本文主要對協議數據的發送和接收的部分進行解讀。

先介紹下PomeloForEgret主要的包含的類:Pomelo,Package,Message,Protocol,Protobuf。Pomelo是跟外界交互的業務邏輯類,而Package,Message,Protocol和Protobuf類作為Pomelo的工具類。

Message的數據傳送類型包括TYPE_REQUEST,TYPE_NOTIFY,TYPE_RESPONSE,TYPE_PUSH。

Package的業務類型包括TYPE_HANDSHAKE,TYPE_HANDSHAKE,TYPE_HEARTBEAT,TYPE_DATA,TYPE_KICK。

一、 協議的數據發送數據
協議的數據發送需要經過以下3個流程:

  1. Pomelo類的request方法。
    requet(route,msg,cg)有以下三個步驟:
    a. reqId++
    b. sendMessage(reqId,route,msg)
    c. callbacks[reqId]=cb,routeMap[reqId]=route,保存協議發送的回調,這個回調用來處理同一次同一個協議(路由)返回的數據。
  2. Pomelo的sendMessage方法,就是上面的1.b方法。
    sendMessage(reqId,route,msg)有以下步驟:
    a. byte:egrete.ByteArray
    b. this._message.encode(reqId,route,msg),利用Message工具類對發送的數據序列化成二進制數據(需要用到Protobuf工具類或Protocol工具類)。
    c. this._package.encode(Package.TYPE_DATA,byte),利用Package工具類,加上Package的業務類型(見上),后面加上2.b步驟的二進制數據,寫入字節流。
  3. Pomelo的send方法。
    a. this.socket.writeByte(byte)
    b. this.socket.flush

特別的,上面的2.b和2.c的步驟具體如下:
2.b Message的encode方法將協議發送的數據進行序列化:
把Message的數據傳送類型(見上)寫入字節流。
把reqId寫入字節流。
把路由寫入字節流。
利用Protobuf或Protocol工具類把協議的數據寫入字節流,具體如下[tag,type][value] [tag,type][value] [tag,type][value]……。
所以message的字節流應該是這樣的:[傳送類型][reqId][route][protobuf序列化數據]
2.c Package的encode方法步驟如下:
寫入Package業務類型(見上)。
寫入2.b生成的二進制數據長度,占3個字節。
寫入2.b生成的二進制。

所以package的字節流應該這樣的:[業務類型][message的數據長度占3個字節][Message的數據]

  1. 協議的數據接收。
    協議的數據接收主要包括以下的步驟:
  2. this._package.decode(byte):
    a. 讀取Package的業務類型(見上)。
    b. 讀取message的長度
    c. 讀取message。
    return {type:type,body:body,length:len}

  3. this._message.decode(data):
    a.Message的數據傳送類型(見上)。
    b.讀取reqId。
    c.讀取路由
    d.利用Protobuf或Protocol類將2.c的message數據轉化為對象或者所需的數據。

協議的數據發送和接受的流程是反過來一一對應的。

最后再貼下Protobuf類序列化和反序列化無符號int的寫法,感覺挺巧妙的:
源碼分析系列之PomeloForEgret
源碼分析系列之PomeloForEgret

完。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南丹县| 辽宁省| 瑞丽市| 和林格尔县| 濮阳县| 平潭县| 普宁市| 康保县| 大冶市| 东乌珠穆沁旗| 东海县| 古浪县| 紫金县| 武山县| 鄱阳县| 枣阳市| 通海县| 昌图县| 高淳县| 当涂县| 乐昌市| 武胜县| 榆中县| 图木舒克市| 清苑县| 深水埗区| 大名县| 大宁县| 两当县| 嘉峪关市| 玛曲县| 曲阜市| 呼伦贝尔市| 伊金霍洛旗| 宣武区| 昌宁县| 广德县| 辛集市| 汝南县| 喀什市| 东丽区|