Skip to content

Latest commit

 

History

History
127 lines (92 loc) · 4.22 KB

网络模块.md

File metadata and controls

127 lines (92 loc) · 4.22 KB

网络通信模块

数据协议用Protobufjs,网络协议用WebSocket

Protobufjs(用的是5.x)

1、安装nodejs、npm

2、到新建的cocoscreator工程目录,初始化项目:执行npm init -y

3、安装protobufjs5.x版本:执行npm install --save-dev protobufjs@5

4、覆盖原protobuf的loadProtoFile方法

protobuf原来的loadProtoFile方法:

ProtoBuf.loadProtoFile = function(filename, callback, builder) {
    if (callback && typeof callback === 'object')
        builder = callback,
        callback = null;
    else if (!callback || typeof callback !== 'function')
        callback = null;
    if (callback)
        return ProtoBuf.Util.fetch(typeof filename === 'string' ? filename : filename["root"]+"/"+filename["file"], function(contents) {
            if (contents === null) {
                callback(Error("Failed to fetch file"));
                return;
            }
            try {
                callback(null, ProtoBuf.loadProto(contents, builder, filename));
            } catch (e) {
                callback(e);
            }
        });
    var contents = ProtoBuf.Util.fetch(typeof filename === 'object' ? filename["root"]+"/"+filename["file"] : filename);
    return contents === null ? null : ProtoBuf.loadProto(contents, builder, filename);
};

这里用了ProtoBuf.Util.fetch来读文件,所以需要重写loadProtoFile方法,用cc.loader.loadRes代替Util.fetch方法来读取文件:

let ProtoBuf = require('protobufjs');
ProtoBuf.Util.IS_NODE = cc.sys.isNative;
// 此方法是将ProtoBuf.Util.fetch函数替换成cc.loader.loadRes函数,以解决在微信小游戏中不能使用XHR的问题
ProtoBuf.loadProtoFile = function(filename, callback, builder) {
    if (callback && typeof callback === 'object')
        builder = callback,
        callback = null;
    else if (!callback || typeof callback !== 'function')
        callback = null;
    if (callback)
        return cc.loader.loadRes(typeof filename === 'string' ? filename : filename["root"]+"/"+filename["file"], function(error, contents) {
            if (contents === null) {
                callback(Error("Failed to fetch file"));
                return;
            }
            try {
                callback(error, ProtoBuf.loadProto(contents, builder, filename));
            } catch (e) {
                callback(e);
            }
        });
    var contents = cc.loader.loadRes(typeof filename === 'object' ? filename["root"]+"/"+filename["file"] : filename); 
    return contents === null ? null : ProtoBuf.loadProto(contents, builder, filename);
};

WebSocket

CocosCreator已经支持WebSocket,而如果是微信小游戏则用微信提供的WebSocket,具体查看:https://developers.weixin.qq.com/minigame/dev/api/network/websocket/wx.connectSocket.html

工程中两种都实现了,其中浏览器平台已经测试过可行,并且提供了Nodejs服务端工程。


服务端(hello-ws)

1、假设已经安装了nodejs和npm

2、用VSCode打开工程,并且运行


客户端

  • ProtoBuf.ts:对protobufjs的修改和封装

  • ProtoLoader.ts:用于加载proto文件

  • Message.ts:proto msg的基类,并将msg缓存起来

  • ProtoMessage.ts:插件根据proto文件生成的代码

  • Socket.ts:WebSocket/WxSocket的具体实现

  • SocketDelegate.ts:Socket代理类,根据具体平台创建socket,提供统一回调接口供具体Socket调用

  • Network.ts:网络的逻辑实现,跟用户打交道,连接网络、关闭网络、登录流程、断网、重连都可以在这里处理


proto-killer插件

将proto转成TS代码,在开发中会有编辑器智能提示。


如何使用

// 创建连接
let network = new Network();

// 跟protobuf一起使用
let login = new Login();
login.cmd = 'login';
login.name = 'Clever';
login.pw = '123456';
network.send(login);

具体怎么使用可以看教程文档:CocosCreator游戏开发框架(二):怎么用