protected override void ClientOnDataReceived(object sender, DataReceivedEventArgs e)
        {
            var filter = new ReceiveFilter();
            var info   = filter.Filter(e.Data, 0, e.Data.Length, true, out int rest);

            using (var scope = Applibs.AutofacConfig.Container.BeginLifetimeScope())
            {
                var cmd    = scope.ResolveKeyed <IServerCommand>(info.Type);
                var result = cmd.Excute(info);
                if (result.Item1 != null)
                {
                    Console.WriteLine($"Command:{info.Type} Content:{info.Body} Execute Fail:{result.Item1.Message}");
                }

                if (!this.timer.Enabled && info.Type == KeyType.LoginSuccess)
                {
                    //// 啟動心跳包
                    this.timer.Start();
                    IsLogin = true;
                }
            }
        }
Example #2
0
        private bool ReaderBuffer(ref ReadOnlySequence <byte> buffer, out SequencePosition consumed, out SequencePosition examined)
        {
            consumed = buffer.Start;
            examined = buffer.End;

            var bytesConsumedTotal = 0L;

            var maxPackageLength = ClientOptions.MaxRequestLength;
            var seqReader        = new SequenceReader <byte>(buffer);

            while (true)
            {
                //过滤解析
                if (ReceiveFilter != null)
                {
                    var packageInfo   = ReceiveFilter.Filter(ref seqReader);
                    var bytesConsumed = seqReader.Consumed;
                    bytesConsumedTotal += bytesConsumed;

                    var len = bytesConsumed;

                    // nothing has been consumed, need more data
                    if (len == 0)
                    {
                        len = seqReader.Length;
                    }

                    if (maxPackageLength > 0 && len > maxPackageLength)
                    {
                        HandleLog.WriteLine($"Package cannot be larger than {maxPackageLength}.");
                        // close the the connection directly
                        Close();
                        return(false);
                    }

                    // continue receive...
                    if (packageInfo == null)
                    {
                        consumed = buffer.GetPosition(bytesConsumedTotal);
                        return(true);
                    }
                    if (!packageInfo.Success)
                    {
                        HandleLog.WriteLine(packageInfo.Message);
                    }
                    else
                    {
                        OnReceived?.Invoke(Socket, packageInfo);
                    }

                    if (seqReader.End) // no more data
                    {
                        examined = consumed = buffer.End;
                        return(true);
                    }

                    seqReader = new SequenceReader <byte>(seqReader.Sequence.Slice(bytesConsumed));
                }
                else
                {
                    examined = consumed = buffer.End;
                    var packageInfo = new TRequestInfo()
                    {
                        Success = true,
                        Raw     = buffer.ToArray()
                    };
                    OnReceived?.Invoke(Socket, packageInfo);
                    return(true);
                }
            }
        }