一个可屏蔽长短连接的网络模块

前言

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

  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,每一个引擎实现的方式都不一样。我只是从框架和封装的角度整理一下具体的使用方式,其实细节的东西,你没有遇到的时候也是没办法理解的,代码里都是经验。有想法的同窗留言吧。网络

欢迎扫码关注公众号《微笑游戏》,浏览更多内容。

微信图片_20190904220029.jpg

欢迎扫码关注公众号《微笑游戏》,浏览更多内容。框架

相关文章
相关标签/搜索