示例#1
0
 // Update is called once per frame
 void Update()
 {
     if (Time.frameCount % 60 == 0)
     {
         byte[]   bytes = Encoding.UTF8.GetBytes("I am Server");
         PackHead head  = new PackHead();
         head.MsgID      = 1;
         head.TimeStamp  = DateTime.Now.Second;
         head.PackLength = (short)bytes.Length;
         SocketManager.Instance.Server.Send(head, bytes);
     }
 }
            //创建数据包
            public byte[] Packer(int msgID, byte[] bodyData)
            {
                PackHead head = new PackHead();

                head.MsgID = msgID;
                if (bodyData == null)
                {
                    bodyData = new byte[0];
                }
                head.PackLength = (short)(Marshal.SizeOf(head) + bodyData.Length);
                byte[] headData = SerializeUtil.ToPtr(head);
                byte[] packData = new byte[headData.Length + bodyData.Length];
                Array.Copy(headData, packData, headData.Length);
                Array.Copy(bodyData, 0, packData, headData.Length, bodyData.Length);
                return(packData);
            }
            //解析数据包
            public void UnPack(byte[] data)
            {
                PackHead head       = new PackHead();
                int      headLength = SerializeUtil.ToPtr(head).Length;

                byte[] totalData = new byte[LeftBytes.Length + data.Length];
                if (LeftBytes.Length > 0)
                {
                    Array.Copy(LeftBytes, totalData, LeftBytes.Length);
                }
                Array.Copy(data, 0, totalData, LeftBytes.Length, data.Length);

                if (totalData.Length < headLength)
                {
                    //消息头不足
                    LeftBytes = totalData;
                    return;
                }
                byte[] headData = new byte[headLength];
                Array.Copy(totalData, headData, headLength);
                head = SerializeUtil.FromPtr <PackHead>(headData);
                if (totalData.Length < head.PackLength)
                {
                    //接受消息大小不足
                    LeftBytes = totalData;
                    return;
                }
                byte[] bodyData = new byte[head.PackLength - headLength];
                Array.Copy(totalData, headLength, bodyData, 0, bodyData.Length);
                //整包发送
                SendPack(head, bodyData);
                LeftBytes = new byte[totalData.Length - head.PackLength];
                if (LeftBytes.Length > 0)
                {
                    //发生粘包
                    Array.Copy(totalData, head.PackLength, LeftBytes, 0, LeftBytes.Length);
                    if (LeftBytes.Length >= headLength)
                    {
                        //采用递归进行再次拆包
                        UnPack(new byte[0]);
                    }
                }
            }
 //发送消息体
 public void SendPack(PackHead head, byte[] bodyData)
 {
     Debug.Log("接收消息ID:" + head.MsgID);
     MsgManager.Instance.Dispatch(head.MsgID, bodyData);
 }