Пример #1
0
    /*
     *  build = proto.Build();
     *  build.WriteTo(stream);
     *  mess.buff = stream.ToArray();
     */

    public void Write(CSMsg rCSMsg)
    {
        //序列化数据把数据库发送出去
        CSMsg.Builder proto  = CSMsg.CreateBuilder();
        MemoryStream  stream = new MemoryStream();

        rCSMsg = proto.Build();
        rCSMsg.WriteTo(stream);
        byte[] buff = stream.ToArray();

        //先处理头部,把头部字节数转换成网络字节序
        short  x = (short)buff.Length;
        ushort b = (ushort)System.Net.IPAddress.HostToNetworkOrder(x);               //把x转成相应的大端字节数

        byte[] intBuff = System.BitConverter.GetBytes(b);                            //这样直接取到的就是大端字节序字节数组。大端字节序就是网络字节序

        //把头部和包体字节保存在一个数组中。

        byte[] sendbuff = new byte[intBuff.Length + buff.Length];
        Array.Copy(intBuff, sendbuff, intBuff.Length);                     //先把头部int字节 拷贝到sendbuff
        Array.Copy(buff, 0, sendbuff, intBuff.Length, buff.Length);        //在把数据包字节拷贝到sendbuff数组中

        try
        {
            socket.Send(sendbuff);
        }catch (Exception e) {
            Debug.Log("网络错误,请重新登录" + e.Message);
        }
    }
Пример #2
0
 void Update()
 {
     //每一帧查看是否有消息需要处理
     while (NetIO.Instance.messages.Count > 0)
     {
         CSMsg model = NetIO.Instance.messages[0];
         StartCoroutine("MessageReceive", model);                //创建一个携程,相当于一个线程
         NetIO.Instance.messages.RemoveAt(0);
     }
 }
Пример #3
0
    //下面就是该模块各个功能的逻辑处理


    public void OnLogin(CSMsg rModel)
    {
        if (rModel.Body.RegisterLoginRsp.RspParam.LoginRsp.Type == 3)
        {
            //登录成功就要初始化role数据
            RoleData.Instance().SetDBRoleInfo(rModel.Body.RegisterLoginRsp.RspParam.LoginRsp.Role);
        }

        return;
    }
Пример #4
0
    public static CSMsg mdecode(byte[] value)     //反序列化protobuf得到真正的数据
    {
        CSMsg.Builder builder = new CSMsg.Builder();
        if (builder.MergeFrom(value) == null)
        {
            Debug.Log("反序列化protobuf 失败 !");
        }
        CSMsg Data = builder.Build();

        return(Data);
    }
Пример #5
0
    public void MessageReceive(CSMsg model)                                 //封装接口函数
    {
        switch (model.Body.BagRsp.Cmd)                                      //访问模块的子功能
        {
        case CSBagCmd.CSBagCmd_Fetch:                                       //背包界面显示功能
            OnFetch(model);
            break;

        case CSBagCmd.CSBagCmd_Use:                                         //背包物品的使用功能
            OnBagUse(model);
            break;
        }

        return;
    }
Пример #6
0
    public void MessageReceive(CSMsg model)                             //封装接口函数
    {
        switch (model.Body.DecorateBagRsp.Cmd)                          //访问模块的子功能
        {
        case CSDecorateBagCmd.CSDecorateBagCmd_Fetch:                   // 装饰背包界面显示功能
            OnFetch(model);
            break;

        case CSDecorateBagCmd.CSDecorateBagCmd_ShowSet:                //装饰背包显示设置物品装饰
            OnShowSet(model);
            break;

        case CSDecorateBagCmd.CSDecorateBagCmd_VipFetch:                     //VIP装饰背包界面展现功能
            OnVipFetch(model);
            break;
        }

        return;
    }
Пример #7
0
public class LoginHandler : MonoBehaviour, IHandler {                       //每个模块都会继承IHandler接口
    public void MessageReceive(CSMsg model)                                 //封装接口函数
    {
        switch (model.Body.RegisterLoginRsp.Cmd)                            //访问模块的子功能
        {
        case CSRegisterLoginCmd.CSRegisterLoginCmd_Login:                   // 登录模块
            OnLogin(model);                                                 //登录模块要处理的逻辑
            break;

        case CSRegisterLoginCmd.CSRegisterLoginCmd_Register:                //注册模块
            OnRegister(model);
            break;

        case CSRegisterLoginCmd.CSRegisterLoginCmd_Quit:                     //退出模块
            OnQuit(model);
            break;
        }

        return;
    }
Пример #8
0
    //缓存中有数据处理
    void onData()
    {
        //长度解码
        byte[] result = decode(ref cache);

        //长度解码返回空 说明消息体不全,等待下条消息过来补全
        if (result == null)
        {
            isReading = false;
            return;
        }

        CSMsg message = mdecode(result);

        if (message == null)
        {
            isReading = false;
            return;
        }
        //进行消息的处理,把消息压入一个容器中
        messages.Add(message);
        //尾递归 防止在消息处理过程中 有其他消息到达而没有经过处理
        onData();
    }
Пример #9
0
 public void OnVipFetch(CSMsg rModel)
 {
     return;
 }
Пример #10
0
 public void OnShowSet(CSMsg rModel)
 {
     return;
 }
Пример #11
0
    void MessageReceive(CSMsg model)
    {
        IHandler rHandler = rHadlerList.GetHandler(model.Head.MsgID);   //根据模块号去调用对应的模块功能

        rHandler.MessageReceive(model);                                 //跳转到逻辑功能上
    }
Пример #12
0
 public void OnQuit(CSMsg rModel)
 {
     return;
 }
Пример #13
0
 public void OnRegister(CSMsg rModel)
 {
     return;
 }
Пример #14
0
 public void OnBagUse(CSMsg rModel)
 {
     return;
 }