cocoscreator使用protobuff完整版

前言

nodejs游戏服务器开发系列文章以nodejs+Typescript+CocosCreator+WebSocket为例,搭建服务器和客户端。

protobuf

暂时无纯ts框架的pb库,一般会使用protobufjs,git地址:https://github.com/protobufjs/protobuf.js

同时也可以参考这个文档:https://www.npmjs.com/package/protobufjs

protobufjs有很多不同的版本(minimal,light,full),用户根据自己的项目需要选择合适的版本。各个版本的说明,可以参考git上readme.

建议不要使用git中releases的库,里面更新的慢。使用npm install protobufjs会把库下载到本地。可以看到CHANGELOG.md文档中写的是6.8.8.而在releases中最新的才6.8.6。

另外据说6以上版本protobufjs已经集成了long,bytebuffer库,不需要额外集成了。

本系列文章使用的是完整的protobufjs库(dist/protobuf.js)。

proto文件

搞个测试文件,比如命名为test.proto,内容为:

message user{

required int32 userId=1;

required string userName=2;

}

静态文件

推荐使用静态文件的方式,即预先把proto文件翻译为js文件。

需要全局安装pbjsnpm install protobufjs -g。可以使用pbjs命令用于把proto文件翻译为js静态文件。然后还可以使用pbts命令获得对应的声明文件*.d.ts

pbjs -t static-module -w commonjs -o proto.js *.proto

把目录下所有的proto文件一起生成静态文件到proto.js中

pbts -o proto.d.ts proto.js

为proto.js文件生成生命文件:proto.d.ts。

最终会生成proto.js和proto.d.ts文件

静态方式缺点,会额外生成静态文件,导致包体变大,特别是微信小游戏这种对包体敏感的平台。

服务端集成protobufjs

src目录下新建pb文件夹,把上述生成的静态文件proto.js,proto.d.ts和protobuf.js都放到pb文件夹中。

修改proto.js的var $protobuf = require("protobufjs/minimal");为var $protobuf = require("./protobuf");

修改proto.d.ts的第一句import * as $protobuf from "protobufjs";为import * as $protobuf from "./protobuf";

复制以下内容到 index.ts

import * as WebSocket from "ws"

import proto = require("./pb/proto");

const server = new WebSocket.Server({ port: 8083 });

server.on("listening", () => {

    console.log("服务器启动完毕!开始侦听");

});

server.on("connection", function connection(ws) {

ws.on("message", function incoming(message) {

console.log("received:%s", message);

let u = proto.user.decode(<Uint8Array>message);

console.log("decode, userid:" + u.userId + ", username:" + u.userName);

});

ws.send("hhhello");

});

服务端报错

ctrl+shift+b build的时候顺利。

Debug开启服务器的时候index.ts 报错:Error: Cannot find module ‘./pb/proto’

一开始一直在查模块方向的错误。

后面才恍然大悟:我服务器是用ts开发,最终生成的代码是在dist目录中。

编译的时候只是把ts代码编译到了dist目录,但是proto.js文件和protobuf.js文件我还放在src目录下的pb文件夹呢。

于是在dist目录中创建一个pb文件夹,同时把proto.js,protobuf.js拷贝过去,再次运行一切顺利。

客户端集成protobufjs

assets目录下新建文件夹:pb

把上述提到的protobuf.js放入pb目录下。设置导入为插件。同时还要勾选允许编辑器加载。

同时把proto.js和proto.d.ts放到pb目录下

CososCreator在构建时候会将我们编辑器里所有的js脚本都打包到一个project.js的文件中,原生(native)的话就是project.jsc。

如果我们的protobuf.js打包进去就会报错了,所以这里需要导入为插件,这样做就不会被打包进project.js文件中。


同时由于客户端中已经设置了插件模式。故proto.js中这句var $protobuf = require("protobufjs/minimal");需要改成:var $protobuf=protobuf;

还要修改proto.d.ts的第一句import * as $protobuf from "protobufjs";为import * as $protobuf from "./protobuf";

客户端代码如下:

    private ws: WebSocket;

    start() {

        console.log("go!");

        this.ws = new WebSocket("ws://192.168.2.31:8083");

        this.ws.binaryType="arraybuffer";       

        this.ws.onopen = this.onOpen.bind(this);

        this.ws.onmessage = function (event) {

            console.log("client rcv:" + event.data);

        }

        this.ws.onclose = function (event) {

        }.bind(this);

        this.ws.onerror = function (event) {

        }

    }

    private onOpen(event: MessageEvent) {

        console.log("连接建立啦");


        let u: user = new user()

        u.userId = 1;

        u.userName = "toms";


        let encoded = proto.user.encode(u).finish();

        this.sendData(encoded);

        let xxx = proto.user.decode(encoded);

        console.log("嘿嘿:" + xxx.userName);

    }

    private sendData(data) {

        this.ws.send(data);

    }

注意客户端设置了binaryType为arraybuffer(笔者注释了这行代码,也没有发现有啥问题)

需要注意:客户端decode后还要调用finish(),不然服务端那边解析不出来。

————————————————

版权声明:本文为CSDN博主「iningwei」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/iningwei/article/details/100107254

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容