unity 网络架构设计

本文详细介绍了Unity客户端网络通信的架构设计,包括通信协议制定、粘包拆包处理、封包解包机制、网络包状态管理、请求响应行为及事件推送等关键环节。作者分享了自定义的ScutNetClient实现,并指出仍有心跳包、断线重连和数据加密等功能待完善。
摘要由CSDN通过智能技术生成

一:说明

我致力于Unity客户端开发已有3年,而2016到2017都是在使用probuffer作为前后台通信协议,不过本人不是很想学习js,所以我选择Scut作为自己的练习的服务器。下面是我对ScutNetClient造的一个轮子。

二:归纳

归纳一下Unity客户端网络通信必须要做的事情:通信协议制定、粘包、拆包、封包、解包、网络包状态、连接状态、请求--响应行为、事件推送、心跳以及几个可选的压缩、加密、解密、断线重连。

三:协议规则

记录几个比较重要的协议 

ActionId:Int类型,表示请求需要指定哪个Action处理请求,特定值:1为心跳包请求编号,2为连接中断请求编号,1000以下编号提供给Scut引擎预留使用

MsgId:>0为请求协议号,==0为服务器推送协议号

 https://github.com/ScutGame/Scut/wiki/ActionContract

四:粘包、拆包

目前粘包、拆包大部分的解决方案大部分都是增加消息内容长度,用特殊符号分割的我目前还没有见到过。主要思路是记录包的总长度 TotalLength,当前位置索引CurPos,以及读取状态(读取Head,读取Body)

  void ProcessBytes(byte[] data, int offset, int len)
    {
        if (mReadState == eReadState.ReadHead)
        {
            ReadHead(data, offset, len);
        }
        else if (mReadState == eReadState.ReadBody)
        {
            ReadBody(data, offset, len);
        }
    }

    void ReadHead(byte[] data, int offset, int len)
    {
        mPackLength = BitConverter.ToInt32(data, offset);  // 包的长度
        //Debug.Log("limit:" + len + " Offset:" + offset + " Length:" + mPackLength);
        mBuffers = new byte[mPackLength];

        int realLen = len - offset;
        if (realLen >= HEAD_CO
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值