private async void RequestReceived(BattleSession session, BinaryRequestInfo requestInfo)
        {
            int offset     = 0;
            var sizeHeader = sizeof(MessageType);
            var intSize    = sizeof(int);

            while (offset < requestInfo.Body.Length)
            {
                BaseController controller = null;
                MessageType    msgType    = MessageType.None;
                byte[]         body       = null;

                try
                {
                    var byteArrayHeader     = requestInfo.Body.CloneRange(offset, sizeHeader);
                    var byteArrayBodyLength = requestInfo.Body.CloneRange(offset + sizeHeader, intSize);
                    var bodyLength          = BitConverter.ToInt32(byteArrayBodyLength, 0);

                    body    = requestInfo.Body.CloneRange(offset + intSize + sizeHeader, bodyLength);
                    offset += (sizeHeader + intSize + bodyLength);
                    msgType = (MessageType)BitConverter.ToInt32(byteArrayHeader, 0);
                }
                catch (Exception)
                {
                    var msg = $"{msgType.ToString()}_{ (requestInfo.Body?.Length ?? 0).ToString()}_{session.SocketSession.RemoteEndPoint.ToString()}";
                    Console.WriteLine(msg);
                    return;
                }

                BaseProtocol proto = null;
                proto = ProtocolFactory.DeserializeProtocol(msgType, body);

                try
                {
                    controller = ControllerFactory.CreateController(msgType);
                    await controller.DoPipeline(session, proto);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                    return;
                }
            }
        }
        private async void AsyncTcpSession_DataReceived(object sender, DataEventArgs e)
        {
            int offset     = 0;
            var sizeHeader = sizeof(MessageType);
            var intSize    = sizeof(int);

            while (offset < e.Length)
            {
                var byteArrayHeader     = e.Data.CloneRange(offset, sizeHeader);
                var byteArrayBodyLength = e.Data.CloneRange(offset + sizeHeader, intSize);
                var bodyLength          = BitConverter.ToInt32(byteArrayBodyLength, 0);
                var body = e.Data.CloneRange(offset + intSize + sizeHeader, bodyLength);

                offset += (sizeHeader + intSize + bodyLength);

                var msgType = (MessageType)BitConverter.ToInt32(byteArrayHeader, 0);

                var proto = ProtocolFactory.DeserializeProtocol(msgType, body);

                var controller = ControllerFactory.CreateController(msgType);
                await controller.DoPipeline(proto);
            }
        }