第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

一個可屏蔽長短鏈接的網(wǎng)絡(luò)模塊

標(biāo)簽:
Html5 Cocos2d-x

前言

游戏开发中最复杂的模块,没有之一。其实我也不想写这篇文章,怎奈框架代码卖出去了,得给我的用户一个交代。
网络模块都需要实现哪些功能呢?按我以往的开发经验总结如下:

  1. 消息的正常发送与接收
  2. 长链接的断线重连
  3. 消息发送失败与尝试
  4. 长链接的心跳处理
  5. 适应各种服务器定义的协议格式
  6. 适应各种数据传输格式
  7. 屏蔽长短链接的差异
  8. 长链接支持发送协议号与接收协议号不同的情况。
  9. 让短链接也可以像长链接一样更新数据。

有必要屏蔽长短链接吗?

这个看需求吧
有没有开发过程中将长链接改成短链接的情况呢?你客户端不支持,服务器可是支持的。
如果一个团队有很多开发人员,作为主程的你是否要屏蔽底层逻辑,提供统一的调用接口给其他开发人员使用呢?
如果你一个人做一款游戏,你就随便来吧,随便什么样的方式只要你开心就好。

类图

image.png

  1. Service 实现ServiceInterface接口负责屏蔽链接类型
  2. Message 负责封装发送和接收的消息。
  3. MessageHander 负责编解码处理。
  4. ServiceInfo 保存服务器信息。例如 ip 端口,协议号映射等信息。
  5. RemoteProxy 负责调用Service发送消息,接收Service返回的消息并通过事件派发给监听者。

关键代码

  1. ServiceInfo
    image.png
  2. ServiceInterface
    image.png
  3. Service
    image.png
  4. MessageHandler
    image.png
  5. Message
    image.png
  6. RemoteProxy
    image.png

如何使用呢?

  1. 定义一个类来处理链接的监听
    image.png
  2. 定义一个地址和开发环境相关的数据类
    image.png
  3. 实现编解码处理类
    image.png
  4. 定义协议号常量类
    image.png
  5. 定义一个链接
    image.png
  6. 使用方式
export default class LoginController extends LogicController {

    constructor(){
        super(LoginProxy.instance());
    }

    private static ins:LoginController;

    static instance():LoginController{
        if(!this.ins){
            this.ins = new LoginController();
        }
        return this.ins;
    }

    //注册协议号与回调函数
    getProtoList(){
        return [
            [NetConfig.OPEN,this.netOpen],
            [LoginProtocolIDs.LOGIN,this.loginRsp],
        ];
    }

    netOpen(){
        cc.log(' 链接成功 ')
        this.pushView('Prefab/LoginView','LoginView',null,ModuleManager.getLoader(),UIIndex.STACK)
    }
    //进入模块 先链接服务 当然也可以先弹出界面,再推送链接结果。
    intoLayer(){
        ModuleManager.setModuleID(ModuleID.LOGIN)
        //进入此模块,先进行链接操作,如果链接成功 会走loginRsp 函数
        this.remoteProxy.connect(new ServiceInfo(NetConfig.HTTP,AddressConfig.getAdress(AddressConfig.LOGIN,0)));
    }

    // 点击登陆按钮发送请求。
    loginReq(name:string){
        cc.log(" loginReq ",name);
        this.sendMessage(LoginProtocolIDs.LOGIN,{name:name,channel:'crazy'});
    }

    //登陆成功
    loginRsp(msg:ReceiveMessage){
        cc.log(" loginRsp msg ",msg);
        //由于服务器已经关闭,所以不会被调用,正常内容返回时会走这里。
    }

}

结语

细节代码太多了,如果都粘贴上来无法忍受。其实网络那些事论坛里已经有人说的很详细了。使用方式也很多,就好像都是用xxgl,每个引擎实现的方式都不同。我只是从框架和封装的角度整理一下具体的使用方式,其实细节的东西,你没有遇到的时候也是没办法理解的,代码里都是经验。有想法的同学留言吧。

點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學(xué)

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消