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; } } }
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); } } }