在我上一個手游項目中,前端使用的是白鷺引擎,后端使用的框架是pomelo,前端使用的網(wǎng)絡庫是pomelo提供給白鷺的,可以在git上拿到這份源代碼,或者應該pomelo的官網(wǎng)也可以找到。
成都創(chuàng)新互聯(lián)一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務為基礎,以質量求生存,以技術求發(fā)展,成交一個客戶多一個朋友!為您提供成都網(wǎng)站建設、成都網(wǎng)站制作、成都網(wǎng)頁設計、微信小程序開發(fā)、成都網(wǎng)站開發(fā)、成都網(wǎng)站制作、成都軟件開發(fā)、app軟件定制開發(fā)是成都本地專業(yè)的網(wǎng)站建設和網(wǎng)站設計公司,等你一起來見證!本文是對這份PomeloForEgret源碼的分析。一個完整的客戶端網(wǎng)絡庫應該包括初始化,握手,發(fā)送心跳包,協(xié)議數(shù)據(jù)的發(fā)送和接收。PomeloForEgret基于websocket,完整的包含了上述的功能,數(shù)據(jù)的發(fā)送和接收同時支持json數(shù)據(jù)和根據(jù)protobuf數(shù)據(jù)結構協(xié)議序列化的二進制數(shù)據(jù)。本文主要對協(xié)議數(shù)據(jù)的發(fā)送和接收的部分進行解讀。
先介紹下PomeloForEgret主要的包含的類:Pomelo,Package,Message,Protocol,Protobuf。Pomelo是跟外界交互的業(yè)務邏輯類,而Package,Message,Protocol和Protobuf類作為Pomelo的工具類。
Message的數(shù)據(jù)傳送類型包括TYPE_REQUEST,TYPE_NOTIFY,TYPE_RESPONSE,TYPE_PUSH。
Package的業(yè)務類型包括TYPE_HANDSHAKE,TYPE_HANDSHAKE,TYPE_HEARTBEAT,TYPE_DATA,TYPE_KICK。
一、 協(xié)議的數(shù)據(jù)發(fā)送數(shù)據(jù)
協(xié)議的數(shù)據(jù)發(fā)送需要經過以下3個流程:
特別的,上面的2.b和2.c的步驟具體如下:
2.b Message的encode方法將協(xié)議發(fā)送的數(shù)據(jù)進行序列化:
把Message的數(shù)據(jù)傳送類型(見上)寫入字節(jié)流。
把reqId寫入字節(jié)流。
把路由寫入字節(jié)流。
利用Protobuf或Protocol工具類把協(xié)議的數(shù)據(jù)寫入字節(jié)流,具體如下[tag,type][value] [tag,type][value] [tag,type][value]……。
所以message的字節(jié)流應該是這樣的:[傳送類型][reqId][route][protobuf序列化數(shù)據(jù)]
2.c Package的encode方法步驟如下:
寫入Package業(yè)務類型(見上)。
寫入2.b生成的二進制數(shù)據(jù)長度,占3個字節(jié)。
寫入2.b生成的二進制。
所以package的字節(jié)流應該這樣的:[業(yè)務類型][message的數(shù)據(jù)長度占3個字節(jié)][Message的數(shù)據(jù)]
this._package.decode(byte):
a. 讀取Package的業(yè)務類型(見上)。
b. 讀取message的長度
c. 讀取message。
return {type:type,body:body,length:len}
協(xié)議的數(shù)據(jù)發(fā)送和接受的流程是反過來一一對應的。
最后再貼下Protobuf類序列化和反序列化無符號int的寫法,感覺挺巧妙的:
完。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。