Esempio n. 1
0
        protected void CallBack(MessageHead head, RecvData recv)
        {
            int key = head.CmdAct;

            if (head.error == Error.ErrNetTimeout)
            {
            }

            if (foreverCallbackDict.ContainsKey(key))
            {
                foreverCallbackDict[key](head.error, recv);
            }

            if (foreverCallbackDict.ContainsKey(head.cmd))
            {
                foreverCallbackDict[head.cmd](head.error, recv);
            }

            if (indexDict.ContainsKey(head.index))
            {
                indexDict.Remove(head.index);
            }

            if (onceCallbackDict.ContainsKey(head.index))
            {
                onceCallbackDict[head.index](head.error, recv);
            }
        }
Esempio n. 2
0
        public RecvData(MessageHead head, byte[] data)
        {
            this.head = head;
            this.data = data;
            int key = head.cmd * 1024 + head.act;

            if (parseDict.ContainsKey(key))
            {
                parseDict[key](this);
            }
        }
Esempio n. 3
0
        protected void OnRecvHead()
        {
            int read = tcpClient.GetStream().EndRead(asyncReader);

            byte[] data = (byte[])asyncReader.AsyncState;
            asyncReader.AsyncWaitHandle.Close();
            asyncReader = null;
            if (read > 0)
            {
                totalRead += read;
                if (totalRead == MessageHead.Length)
                {
                    totalRead = 0;
                    head      = MessageHead.Parse(data);
                    if (head.error > 0)
                    {
                        if (head.error != Error.ErrOk)
                        {
                            if (onRecvError != null)
                            {
                                onRecvError(head.error);
                            }

                            Log.Warn("服务器返回错误码 : {0}", head.error);
                        }
                    }
                    if (head.len > MessageHead.MaxRecvLength)
                    {
                        Stop(false);
                        disconnCallback(this);
                        return;
                    }

                    if (head.len == 0)
                    {
                        CallBack(head, new RecvData(head));
                        head = null;
                    }

                    ProcessRecv();
                }
                else
                {
                    asyncReader = tcpClient.GetStream().BeginRead(data, totalRead, MessageHead.Length - totalRead, null, data);
                }
            }
            else if (read == 0)
            {
                Stop(false);
                disconnCallback(this);
            }
        }
Esempio n. 4
0
        /// <summary>
        /// 解析协议头
        /// </summary>
        /// <param name="data">数据</param>
        /// <returns>解析好的协议头</returns>
        public static MessageHead Parse(byte[] data)
        {
            MessageHead  head   = new MessageHead();
            MemoryStream stream = new MemoryStream(data);
            BinaryReader reader = new BinaryReader(stream);

            head.len   = reader.ReadUInt32();
            head.error = reader.ReadUInt16();
            head.cmd   = reader.ReadByte();
            head.act   = reader.ReadByte();
            head.index = reader.ReadUInt16();
            head.flags = reader.ReadUInt16();

            return(head);
        }
Esempio n. 5
0
        protected void OnRecvData()
        {
            int read = tcpClient.GetStream().EndRead(asyncReader);

            byte[] data = (byte[])asyncReader.AsyncState;
            asyncReader.AsyncWaitHandle.Close();
            asyncReader = null;
            if (read > 0)
            {
                totalRead += read;
                if (totalRead == head.len)
                {
                    totalRead = 0;

                    uint oldlen = (head.flags & (ushort)MessageHead.Flags.FlagCompress) > 0 ? BitConverter.ToUInt32(data, 0) : 0;
                    if (oldlen > 0)
                    {
                        byte[]          xdata = new byte[oldlen];
                        GZipInputStream gzi   = new GZipInputStream(new MemoryStream(data, 4, (int)head.len - 4));
                        gzi.Read(xdata, 0, xdata.Length);
                        CallBack(head, new RecvData(head, xdata));
                    }
                    else
                    {
                        CallBack(head, new RecvData(head, data));
                    }

                    head = null;
                    ProcessRecv();
                }
                else
                {
                    asyncReader = tcpClient.GetStream().BeginRead(data, totalRead, (int)(head.len - totalRead), null, data);
                }
            }
            else if (read == 0)
            {
                Stop(false);
                disconnCallback(this);
            }
        }
Esempio n. 6
0
        protected void ProcessRecv()
        {
            while (udpClient.Available > 0)
            {
                byte[]      data = udpClient.Receive(ref serverAddr);
                MessageHead head = MessageHead.Parse(data);

                Log.Info("recv index:{0} needack:{1}", head.index, head.needAck);
                if (head.len == 0)
                {
                    if (head.needAck)
                    {
                        SendMsg(new SendData(head.cmd, head.act, (ushort)(head.flags | (ushort)MessageHead.Flags.FlagAck), head.index));
                    }
                    CallBack(head, new RecvData(head));
                }
                else if (head.len <= MessageHead.MaxRecvLength)
                {
                    uint   oldlen  = (head.flags & (ushort)MessageHead.Flags.FlagCompress) > 0 ? BitConverter.ToUInt32(data, MessageHead.Length) : 0;
                    uint   datalen = oldlen > 0 ? oldlen : head.len;
                    byte[] xdata   = new byte[datalen];
                    if (oldlen > 0)
                    {
                        GZipInputStream gzi = new GZipInputStream(new MemoryStream(data, MessageHead.Length + 4, (int)head.len - 4));
                        gzi.Read(xdata, 0, xdata.Length);
                    }
                    else
                    {
                        Array.Copy(data, MessageHead.Length, xdata, 0, datalen);
                    }

                    if (head.needAck)
                    {
                        SendMsg(new SendData(head.cmd, head.act, (ushort)(head.flags | (ushort)MessageHead.Flags.FlagAck), head.index));
                    }
                    CallBack(head, new RecvData(head, xdata));
                }
            }
        }
Esempio n. 7
0
        public override void Stop(bool destroy)
        {
            if (tcpClient != null)
            {
                StopAllCoroutines();

                tcpClient.Close();
                tcpClient = null;

                head         = null;
                asyncWriter  = null;
                asyncReader  = null;
                asyncConnect = null;
                Log.Info("net close {0}", gameObject.name);
            }

            if (destroy)
            {
                Destroy(gameObject);
                Log.Info("net object destroy {0}", gameObject.name);
            }
        }
Esempio n. 8
0
 public RecvData(MessageHead head)
 {
     this.head = head;
 }
Esempio n. 9
0
 public RecvData()
 {
     head = new MessageHead();
 }