游戏开发-丛林战争制作2

本文档详细介绍了Unity游戏开发中客户端与服务器的通信过程,包括客户端如何解析接收到的数据,如何打包并发送数据给服务器,以及如何处理服务器的响应。通过创建Message类来解析和打包数据,使用RequestCode和ActionCode来区分不同类型的请求和响应。客户端通过ClientManager与服务器建立连接,并使用RequestManager管理请求,将消息转发给对应的Request进行处理。同时,还涉及到了客户端UI框架的基础搭建,如登录按钮的设计和UI界面的初步设计。
摘要由CSDN通过智能技术生成

20.如何解析我们客户端的信息并且交给ControllerManager来进行处理

首先是Message类,参数分别是数据的长度和一个回掉的函数委托,用来重复解析数据,这里的话前四个是数据长度,后面4-8是RequestCode,8-12是ActionCode,12以后是数据,我们按照这个来重复对数据进行解析

publicvoid ReadMessage(intnewDateAmount,Action<RequestCode,ActionCode,string> ProcessDataCallBack)

       {

            startIndex += newDateAmount;

            while (true)

            {

                if (startIndex <= 4)

                {

                    return;

                }

                //读取数组的长度,自动省略前四个字节长度

                int count = BitConverter.ToInt32(data, 0);

                if (startIndex - 4 >= count)

                {

                    //解析的是传递的RequestCode

                    RequestCode requestCode =(RequestCode)BitConverter.ToInt32(data, 4);

                    //解析ActionCode

                    ActionCode actionCode =(ActionCode)BitConverter.ToInt32(data, 8);

                    //解析我们的数据,从12开始,解析的长度为count-8

                    String s =Encoding.UTF8.GetString(data, 12, count-8);

                    //回调解析

                    ProcessDataCallBack(requestCode, actionCode,s);

                    Array.Copy(data, count + 4,data, 0, startIndex - count - 4);

                    startIndex -= (count + 4);

                }

                else { break; }

 

            }

        }

然后我们要在Sever里提供一个中介方法来调用ControllerManager里的HandelRequest来处理对客户端发送信息的解析

 

publicvoidHandleRequest(RequestCode requestCode, ActionCode actionCode, string data, Clientclient)

       {

            //这个作为中介,用来作为client和ControllerManager的中间商

            controllerManager.HandleRequest(requestCode,actionCode, data, client);

       }

然后我们在客户端里重复调用ReadMessage完成对信息的解析

publicvoidReceiveCallBack(IAsyncResult ar)

       {

            try

            {

                int count = clientSocket.EndReceive(ar);

               if (count == 0)

                {

                    Close();

                }

                //使用message对client接收到的信息进行解析,这里分别传递的参数是数据长度和回调的方法

               message.ReadMessage(count,OnProcessMessage);

                Start();

            }

 

            catch (Exception e)

            {

                Close();

                Console.WriteLine(e);

            }

 

       }

       //回调信息的处理,这里使用sever里的HandleRequest来处理对客户端的响应,为了避免耦合没有直接使用ControllerManager

       publicvoid OnProcessMessage(RequestCoderequestCode,ActionCode actionCode,string data)

       {

            sever.HandleRequest(requestCode,actionCode, data, this);

       }

21.打包解析我们客户端发送的数据

1.我们在Message里提供一个工具类来打包我们的客户端发送的数据

   publicstaticbyte[]PackData(RequestCode requestCode,string data)

       {

            //这个方法是用来打包数据

            byte[] requestCodeBytes = BitConverter.GetBytes((int)requestCode);

            byte[] dataBytes = Encoding.UTF8.GetBytes(data);

            int dataAmount = requestCodeBytes.Length + dataBytes.Length;

            byte[] dataAmountBytes = BitConverter.GetBytes(dataAmount);

            byte[]newdata=dataAmountBytes.Concat(requestCodeBytes).Concat(dataBytes) asbyte[];

            return newdata;

 

 

 

       }

2.在客户端里向socket发送打包后的信息

publicvoid SendMessage(RequestCoderequestCode,string data)

       {

            byte[]sendData= Message.PackData(requestCode, data);

            clientSocket.Send(sendData);

       }

3.在服务器中介中调用这个客户端发送消息的方法

publicvoid SendMessage(Clientclient,RequestCode requestCode,string data)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值