public void BaseTest()
        {
            var manager = new PacketHandlersBase();
            var pr      = new PacketReaderModule();

            new RegisterNetMethod(manager).Register(new ILogicModule[] { pr });

            Assert.IsNotNull(manager.Handlers[1], "方法没注册到消息管理器里");

            manager.Handlers[1].OnReceive(new NetState(), PacketReader.AcquireContent(DogBuffer.GetFromPool32K()));
            Assert.IsTrue(pr.IsTouchOnReadTest);

            Assert.IsNotNull(manager.Handlers[2], "包读取方法没注册到消息管理器");
            manager.Handlers[2].OnReceive(new NetState(), PacketReader.AcquireContent(DogBuffer.GetFromPool32K()));
            Assert.IsTrue(pr.IsTouchPackageReader);

            Assert.IsNotNull(manager.Handlers[3], "简单读取方法没注册到消息管理器");
            manager.Handlers[3].OnReceive(new NetState(), PacketReader.AcquireContent(DogBuffer.GetFromPool32K()));
            Assert.IsTrue(pr.IsTouchSimpleMethod);
        }
示例#2
0
        /// <summary>
        /// 收到网络消息包
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnSocketRecv(object sender, SocketRecvEventArgs <NetState> e)
        {
            var netState = e.Session.Data;

            netState.ReceiveBuffer.Enqueue(e.Buffer.Bytes, 0, e.Buffer.Length);
            if (netState.ReceiveBuffer.Length > MaxPackageSize)
            {
                //  缓冲区过多,一定发送了某种异常情况
                Logs.Error("client recv buff is full.");
                netState.NetSocket.CloseSocket();
                return;
            }

            while (netState.ReceiveBuffer.Length > 2)   // 大于包头长度才具备解析的需求
            {
                var len = netState.ReceiveBuffer.GetPacketLength();
                if (len == 0)
                {
                    Logs.Error("get package len is zero.");
                    netState.NetSocket.CloseSocket();
                    return;
                }

                if (len < 4)
                {
                    Logs.Error("get package len is min 4.");
                    netState.NetSocket.CloseSocket();
                    return;
                }

                if (len > MaxPackageSize)
                {
                    Logs.Error("get package len is error. size:{0}", len);
                    netState.NetSocket.CloseSocket();
                    return;
                }

                if (len <= netState.ReceiveBuffer.Length)
                {
                    DogBuffer readBuffer;
                    if (len < 1024 * 4)
                    {
                        readBuffer = DogBuffer.GetFromPool4K();
                    }
                    else
                    {
                        readBuffer = DogBuffer.GetFromPool32K();
                    }

                    var get = netState.ReceiveBuffer.Dequeue(readBuffer.Bytes, 0, len);
                    if (get == len)
                    {
                        readBuffer.Length = len;

                        var packageReader = PacketReader.AcquireContent(readBuffer);
                        var packageId     = packageReader.GetPacketID();
                        //Debug.Write("msgId = " + packageId.ToString());

                        var packetHandler = PacketHandlersManger.GetHandler(packageId);
                        if (packetHandler != null)
                        {
                            //  加入网络消息处理
                            if (_useManyTaskThread)
                            {
                                switch (packetHandler.TaskType)
                                {
                                case TaskType.Low:
                                    lowTask.AppendTask(netState, packetHandler, packageReader);
                                    break;

                                case TaskType.Assist:
                                    Logs.Debug("assist task.");
                                    assistTask.AppendTask(netState, packetHandler, packageReader);
                                    break;

                                default:
                                    mainTask.AppendTask(netState, packetHandler, packageReader);
                                    break;
                                }
                            }
                            else
                            {
                                mainTask.AppendTask(netState, packetHandler, packageReader);
                            }
                        }
                        else
                        {
                            Logs.Error("unknow packetid. code={0}", packageId);
                            netState.ErrorCount++;
                            if (netState.ErrorCount >= 10)
                            {
                                //  错误达到极大值,则关闭连接
                                Logs.Error("ip {0} error count max.", netState.GetIP());
                                netState.NetSocket.CloseSocket();
                            }
                        }
                    }
                    continue;
                }
                break;
            }
        }
        void NetSocket_SocketRecv(object sender, SocketRecvEventArgs <NetState> e)
        {
            var netState = e.Session.Data;

            netState.ReceiveBuffer.Enqueue(e.Buffer.Bytes, 0, e.Buffer.Length);

            if (netState.ReceiveBuffer.Length > MaxPackageSize)
            {
                //  缓冲区过多,一定发送了某种异常情况
                Logs.Error("client recv buff is full.");
                netState.NetSocket.CloseSocket();
                return;
            }

            while (netState.ReceiveBuffer.Length > 2)
            {
                var len = netState.ReceiveBuffer.GetPacketLength();
                if (len == 0)
                {
                    Logs.Error("get package len is zero.");
                    netState.NetSocket.CloseSocket();
                    return;
                }

                if (len < 4)
                {
                    Logs.Error("package is min 4.");
                    netState.NetSocket.CloseSocket();
                    return;
                }


                if (len > MaxPackageSize)
                {
                    Logs.Error("get package len is error. size:{0}", len);
                    netState.NetSocket.CloseSocket();
                    return;
                }

                IsWaitCheckOnline = false;

                if (len <= netState.ReceiveBuffer.Length)
                {
                    DogBuffer readBuffer;
                    if (len < 1024 * 4)
                    {
                        readBuffer = DogBuffer.GetFromPool4K();
                    }
                    else
                    {
                        readBuffer = DogBuffer.GetFromPool32K();
                    }

                    if (len >= readBuffer.Bytes.Length)
                    {
                        readBuffer.UpdateCapacity(len);
                    }

                    var get = netState.ReceiveBuffer.Dequeue(readBuffer.Bytes, 0, len);
                    if (get == len)
                    {
                        readBuffer.Length = len;

                        var    packageReader = PacketReader.AcquireContent(readBuffer);
                        ushort id            = packageReader.GetPacketID();
                        Logs.Debug("msgid= {0}", id);

                        var packetHandler = PacketHandlersManger.GetHandler(id);
                        if (packetHandler != null)
                        {
                            //  加入网络消息处理
                            TaskManager.AppendTask(netState, packetHandler, packageReader);
                        }
                        else
                        {
                            Logs.Error("unknow packetid. code={0}", id);
                        }
                    }

                    continue;
                }

                break;
            }
        }