在我上一個手遊項目中,前端使用的是白鷺引擎,後端使用的框架是pomelo,前端使用的網絡庫是pomelo提供給白鷺的,能夠在git上拿到這份源代碼,或者應該pomelo的官網也能夠找到。前端
本文是對這份PomeloForEgret源碼的分析。一個完整的客戶端網絡庫應該包括初始化,握手,發送心跳包,協議數據的發送和接收。PomeloForEgret基於websocket,完整的包含了上述的功能,數據的發送和接收同時支持json數據和根據protobuf數據結構協議序列化的二進制數據。本文主要對協議數據的發送和接收的部分進行解讀。git
先介紹下PomeloForEgret主要的包含的類:Pomelo,Package,Message,Protocol,Protobuf。Pomelo是跟外界交互的業務邏輯類,而Package,Message,Protocol和Protobuf類做爲Pomelo的工具類。web
Message的數據傳送類型包括TYPE_REQUEST,TYPE_NOTIFY,TYPE_RESPONSE,TYPE_PUSH。json
Package的業務類型包括TYPE_HANDSHAKE,TYPE_HANDSHAKE,TYPE_HEARTBEAT,TYPE_DATA,TYPE_KICK。後端
1、 協議的數據發送數據
協議的數據發送須要通過如下3個流程:websocket
特別的,上面的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的數據]數據結構
this._package.decode(byte):
a. 讀取Package的業務類型(見上)。
b. 讀取message的長度
c. 讀取message。
return {type:type,body:body,length:len}框架
協議的數據發送和接受的流程是反過來一一對應的。socket
最後再貼下Protobuf類序列化和反序列化無符號int的寫法,感受挺巧妙的:
完。