private void Client_OnPackReceived(object sender, PackEventArgs e) { var type = e.Pack.GetType(); Action <object> handler; if (this.handlers.TryGetValue(type, out handler)) { handler?.Invoke(e.Pack); } }
private async Task BeginRead(Stream ns) { Log.Debug("Begin read loop."); var readBuffer = new RingBufferStream(); ICryptoTransform transform = null; var br = new BinaryReader(readBuffer); var buffer = new byte[4096]; int packLen = -1; try { while (true) { int count = await ns.ReadAsync(buffer, 0, buffer.Length); Log.Debug("Read {0} bytes.", count); if (count <= 0) { break; } readBuffer.Append(buffer, 0, count); while (true) { //切换加密 if (transform != this.readCrypto) { transform = this.readCrypto; if (transform == null) { br = new BinaryReader(readBuffer); } else { var cs = new CryptoStream(readBuffer, transform, CryptoStreamMode.Read); br = new BinaryReader(cs); } } if (packLen < 0) { if (readBuffer.Length >= 2) { packLen = br.ReadUInt16(); readBuffer.ClearPrevious(); } } if (packLen == 0) { continue; } else if (packLen > 0) { if (readBuffer.Length >= packLen) { var pack = DecodePack(br.ReadBytes(packLen)); Log.Debug("Read pack: {0}.", pack); if (pack != null) { var e = new PackEventArgs(pack); this.OnPackReceived?.Invoke(this, e); } readBuffer.ClearPrevious(); packLen = -1; } else { break; } } else { break; } } } } catch (Exception ex) { Log.Error("Read Error: {0}", ex.Message); } finally { Log.Debug("End read."); try { this.writeQueue.CompleteAdding(); } catch { } ns.Close(); } }