青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

專職C++

不能停止的腳步

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  163 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

常用鏈接

留言簿(28)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

本文基于node 6.9.x 使用的protobuf.js的版本 5.0.2

因為layabox 1.6.x引擎自帶的protobuf.js的版本是5.0.1,考慮兩邊兼容,所以我在node服務器端使用5.0.2

我的目標用js同時實現手機端和服務器端,不用搞兩套語言了,使用protobuf就不重造車輪了

首先下載安裝
protobufjs  https://github.com/dcodeIO/protobuf.js/tree/5.0.2

用npm命令  npm install protobufjs@5

安裝完成后,就可以使用了protobuf.js了



 

為了實戰,我這里使用了多個proto文件

放到工程的proto目錄下面

msghead.proto

---------------------------------------分割線開始-------------------------------------------------------

syntax = "proto3";

package lz;

 

enum MsgType {    //消息類型

Request = 0;  //請求類弄

Answer = 1;   //響應類型

Notice = 2;   //通知類型

NotMessage = 3; //不是消息

}

 

//消息頭

message MsgHead

{

required int32 flag = 1 [default = 1978];   //消息標志,固定值為1978

required int32 id   = 2;   //MessageID

required MsgType type = 3 [default = 0]; //消息類型

}

---------------------------------------分割線結束-------------------------------------------------------

 

noticemsgid.proto

---------------------------------------分割線開始-------------------------------------------------------

syntax = "proto3";

package lz;

 

//這里的消息ID,只是通知消息

enum NoticeMsgID

{

GameOver = 1;

};

---------------------------------------分割線結束-------------------------------------------------------

msgid.proto

---------------------------------------分割線開始-------------------------------------------------------

syntax = "proto3";

package lz;

//這里的消息ID,對應的消息定義必須成對出現

enum MsgID

{

HelloWorld = 1;

};

---------------------------------------分割線結束-------------------------------------------------------

test.proto

---------------------------------------分割線開始-------------------------------------------------------

syntax = "proto3";

package lz.msg;

 

message ReqHelloWorld   //MsgID = HelloWorld

{

    required int32     id  = 1;  // ID

    required string    str = 2;  // str

    optional int32     opt = 3;  //optional field

}

 

message AnsHelloWorld

{

    required int32   Result = 1;      //處理結果

    optional string error_msg = 2;   //錯誤信息

}

 

message NoticeGameOver

{

    required int32 Result = 1;           //

};

---------------------------------------分割線結束-------------------------------------------------------

msg.proto

---------------------------------------分割線開始-------------------------------------------------------

//這里把所有的proto文件包含進來

package lz;

syntax = "proto3";

import "msghead.proto";

import "msgid.proto";

import "noticemsgid.proto";

import "test.proto";

---------------------------------------分割線結束-------------------------------------------------------

 

當然,也可以把這些放到一個文件中.
安裝完成protobufjs后,在node_module/.bin/有pbjs.cmd 可以生成對應的proto的js代碼
如:
pbjs D:\newgame\proto\msg.proto -t commonjs >d:\tmp\a.js


import fs from "fs";
import Protobuf from "protobuf";
import ByteBuffer from "ByteBuffer";
//消息管理器類,用于消息分發,這里只是demo,所以這個只有簡單的功能
class MsgManager {
    constructor(){
        this._notice_map = new Map();
        this._request_map = new Map();
        this._answer_map = new Map();
        this._buffMsg = new ByteBuffer(4192);
    }    
    get notice_map() { return this._notice_map; }
    get request_map() { return this._request_map; }
    get answer_map() { return this._answer_map;}
         //消息編碼  并放到this._buffMsg中
    encode_msg(msgDef, data) {
        let msgHead = this.MsgHead;                     //在關聯的時候,將消息ID,類型與消息體關聯了
        msgHead.id = msgDef._msgHead.id;
        msgHead.type = msgDef._msgHead.type;

        this._buffMsg.clear();            //清除緩沖
        this._buffMsg.writeInt32(0);  //預寫入消息包的大小  4字節包體大小 + 2字節消息包頭大小 + 消息包頭數據 + 消息體數據

        let msgHeadSizeOffset = this._buffMsg.offset;  //這里記錄消息包頭大小偏移位置
        this._buffMsg.writeInt16(0);  //預寫入消息包頭大小
        msgHead.encode(this._buffMsg);  //消息頭編碼
        this._buffMsg.writeInt16(this._buffMsg.offset - msgHeadSizeOffset, msgHeadSizeOffset); //寫往下正確的消息包頭大小
        let msg = new msgDef(data);  
        msg.encode(this._buffMsg);  //消息體編碼
        let msgSize = this._buffMsg.offset;
        this._buffMsg.writeInt32(this._buffMsg.offset, 0);  //寫入正確的消息包大小
        console.log(this._buffMsg);
    }
     //解碼處理
    decode_msg() {
        let bb = new ByteBuffer(this._buffMsg.offset);    
        this._buffMsg.copyTo(bb, 0, 0, this._buffMsg.offset);  //取出要解碼的數據    在解碼的過程中,數據實際的數據大于解碼需要的數據,會拋出異常,所以在這里先把這個消息的數據復制出來,再解碼,注:這里,暫時沒有做拆包處理
        let msgSize = bb.readInt32();     //讀取包大小
        let headSize = bb.readInt16();   //取消息頭大小
        let head = this.lz.MsgHead.decode(bb, headSize-2);  //取得消息頭數據
        console.log(head);
        let msg_map;
        switch(head.type)   //根據類型,取消息映射表
        {
            case this.MsgType.Request:
                msg_map = this.request_map;
                break;
            case this.MsgType.Answer:
                msg_map = this.answer_map;
                break;
            case this.MsgType.Notice:
                msg_map = this.notice_map;
                break;
        }
        let msg = msg_map.get(head.id).decode(bb);   //根據id,解碼數據
        console.log(msg);
    }    
}



//這里是處理消息的關聯
var msgMgr = new MsgManager();
function msg_process(messageMgr) {
    //讀取proto文件,并生成相應的代碼
    let protodata = fs.readFileSync("./proto/msg.proto").toString();  
    let lz = Protobuf.loadProto(protodata,null,"./proto/msg.proto").build("lz");   //生成package lz下面對像消息數據

    messageMgr.MsgType     = lz.MsgType;    //消息類型定義
    messageMgr.MsgID       = lz.MsgID;        //消息id定義
    messageMgr.NoticeMsgID = lz.NoticeMsgID; //通知消息定義
    messageMgr.Msg         = lz.msg;             //所有的消息定義
    messageMgr.MsgHead     = new lz.MsgHead();   //消息頭對像,對于發送的時候,減少new的次數
    messageMgr.MsgHead.flag = 1978;
    messageMgr.lz          = lz;
    //關聯:請求響應 消息
    for(let msgName in messageMgr.MsgID)
    {
        let msgReq = "Req" + msgName;  //請求消息名稱
        let msgAns = "Ans" + msgName;  //響應消息名稱
        let msgID = messageMgr.MsgID[msgName];  //對應的消息ID
        let req = lz.msg[msgReq];    //請求消息的消息定義對象
        let ans = lz.msg[msgAns];    //響應消息的消息定義對象
        req._msgHead = {id:msgID, type:messageMgr.MsgType.Request};   //生成消息頭
        ans._msgHead = {id:msgID, type:messageMgr.MsgType.Answer};
        messageMgr.request_map.set(msgID, req);    //建立ID與消息的關聯
        messageMgr.answer_map.set(msgID, ans);
    }
    //關聯通知消息
    for(let msgName in messageMgr.NoticeMsgID)
    {
        let msgNotice = "Notice" + msgName;
        let msgID = messageMgr.NoticeMsgID[msgName];
        let notice = lz.msg[msgNotice];
        notice._msgHead = {id:msgID, type:messageMgr.MsgType.Notice};
        messageMgr.notice_map.set(msgID, notice);
    }

    console.log(messageMgr.request_map, messageMgr.answer_map, messageMgr.notice_map);
}

msg_process(msgMgr);  //關聯消息
msgMgr.encode_msg(msgMgr.Msg.ReqHelloWorld, { id: 1999, str: "測試發送中文", opt: 0});  //編碼一個消息
msgMgr.decode_msg();   //解碼一個消息


posted on 2017-02-06 18:12 冬瓜 閱讀(2285) 評論(0)  編輯 收藏 引用 所屬分類: 原創javascript
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久免费视频这里只有精品| 欧美伊人久久| 亚洲激情视频| 国产日韩欧美精品| 欧美日产国产成人免费图片| 免费观看30秒视频久久| 夜夜夜久久久| 亚洲一区二区成人在线观看| 亚洲综合好骚| 亚洲欧美变态国产另类| 久久久青草婷婷精品综合日韩 | 国产精品久久久久国产a级| 欧美成人69| 国产精品麻豆成人av电影艾秋| 国产精品亚洲激情| 国产亚洲精品美女| 一区二区三区日韩欧美精品| 亚洲免费视频在线观看| 性久久久久久久久| 欧美www在线| 亚洲免费视频中文字幕| 久久久久久久一区| 欧美日韩一区二区三区免费| 一区一区视频| 久久久精品免费视频| 亚洲日本视频| 欧美一区二区三区四区在线 | 午夜精品视频网站| 欧美亚洲一区二区三区| 欧美日韩日韩| 亚洲日本在线观看| 欧美国产精品劲爆| 久久久久久国产精品mv| 国产一区在线免费观看| 亚洲欧美999| 中国日韩欧美久久久久久久久| 欧美韩日视频| 亚洲精品一区二| 91久久线看在观草草青青| 久久久久国产一区二区三区| 黄色成人小视频| 久久综合久色欧美综合狠狠| 欧美在线视频一区二区| 国产精品三区www17con| 久久精品30| 你懂的视频欧美| 在线一区二区三区四区| 一本色道久久88精品综合| 国产精品毛片高清在线完整版| 午夜精品一区二区三区在线视| 午夜精品久久久久久久久久久久 | 日韩一区二区久久| 亚洲国产另类久久精品| 欧美午夜视频在线| 久久久不卡网国产精品一区| 欧美片第一页| 免费一级欧美片在线播放| 欧美成人黑人xx视频免费观看| 在线性视频日韩欧美| 亚洲免费观看在线观看| 日韩亚洲欧美高清| 亚洲第一页在线| 亚洲男人av电影| 一区二区三区欧美在线| 久久精品国产一区二区三区免费看| 亚洲激情成人网| 欧美在线视频在线播放完整版免费观看| 亚洲欧洲一区二区在线播放| 亚洲永久精品大片| 一区二区三区精品| 欧美高清成人| 亚洲东热激情| 99热免费精品在线观看| 欧美成人综合一区| 国产精品地址| 日韩小视频在线观看专区| 91久久国产综合久久| 国内精品久久久久久久影视蜜臀| 亚洲黑丝在线| 国产精品久久久久久影视| 欧美成人a∨高清免费观看| 久久av老司机精品网站导航| 日韩亚洲欧美在线观看| 欧美成人精品激情在线观看| 欧美一区二区成人| 亚洲视频一区二区| 日韩系列欧美系列| 亚洲日本在线观看| 美女黄毛**国产精品啪啪| 久久精品盗摄| aa级大片欧美三级| 国产亚洲一区精品| 狼人社综合社区| 亚洲欧美日韩一区| 美女主播精品视频一二三四| 亚洲国产精品尤物yw在线观看| 久久人人爽人人爽| 国产午夜精品全部视频在线播放| 亚洲精品小视频在线观看| 亚洲一区二区久久| 一区二区视频欧美| 欧美精品一区二区视频| 欧美一区日韩一区| 亚洲国产精品成人精品| 亚洲欧美日韩天堂| 在线电影国产精品| 国产欧美二区| 欧美日韩久久| 牛牛精品成人免费视频| 欧美夜福利tv在线| 宅男精品视频| 一区二区欧美在线| 99精品国产高清一区二区| 亚洲第一毛片| 91久久精品一区| 最新日韩在线视频| 欧美大片专区| 亚洲人成人99网站| 91久久精品国产91性色tv| 亚洲激情国产精品| 亚洲欧洲精品一区二区三区 | 欧美xart系列高清| 欧美精品色综合| 国产精品毛片在线看| 激情久久久久久久| 日韩亚洲欧美高清| 亚洲婷婷在线| 欧美亚洲免费高清在线观看| 欧美成人激情在线| 亚洲视频一二| 欧美高清视频在线观看| 欧美三级视频在线观看| 国产婷婷色一区二区三区在线| 激情六月婷婷综合| 亚洲主播在线播放| 欧美成人免费全部| 欧美专区福利在线| 亚洲欧美日韩中文视频| 久久大香伊蕉在人线观看热2| 亚洲最黄网站| 国产精品qvod| 亚洲欧洲综合| 久久综合久久综合这里只有精品 | 久久国产日韩| 国产精品自拍在线| 99国产精品久久久久久久久久| 欧美jizzhd精品欧美巨大免费| 亚洲资源av| 国产伦精品一区二区三区免费迷| 一区二区三区视频观看| 亚洲韩国青草视频| 欧美人与性动交a欧美精品| 亚洲精品日韩综合观看成人91| 亚洲欧洲日本专区| 国产精品你懂的在线欣赏| 久久久久.com| 欧美~级网站不卡| 亚洲一区二区三区777| 在线亚洲成人| 亚洲精品一区中文| 欧美一区二区免费| 亚洲国产第一页| 亚洲男人天堂2024| 一道本一区二区| 久久偷窥视频| 久久精品99国产精品日本| 欧美激情区在线播放| 久久先锋影音av| 欧美日韩四区| 亚洲精品久久久久久久久久久| 国产综合色产在线精品| 亚洲视频二区| 国产日韩在线播放| 久久久久久高潮国产精品视| 欧美亚州一区二区三区 | 久久精品人人做人人爽电影蜜月| 欧美天天在线| 久久久国际精品| 亚洲免费观看高清在线观看| 艳女tv在线观看国产一区| 欧美日韩免费高清| 亚洲欧美色一区| 欧美激情国产日韩精品一区18| 亚洲人体大胆视频| 国产精品人人爽人人做我的可爱| 亚洲精品系列| 亚洲一区二区三区在线播放| 欧美日韩综合在线| 亚洲午夜未删减在线观看| 亚洲特色特黄| 国产精品成人一区二区三区夜夜夜 | 久久国产一区二区| 国产欧美日韩专区发布| 亚洲一区二区三区欧美| 亚洲影院免费观看| 国产区亚洲区欧美区| 久久久久国产精品一区三寸| 亚洲激情自拍| 亚洲一区中文| 亚洲第一页中文字幕|