protected override void OnReceive(object message) { message.Match().With <ClientWrite>(w => { if (!_writePending) { _writePending = true; _connection.Tell(Tcp.Write.Create(w.Bytes, WriteAck.Instance)); } else { _queuedWrites.Enqueue(w.Bytes); } }).With <WriteAck>(() => { if (_queuedWrites.Count != 0) { var next = _queuedWrites.Dequeue(); _connection.Tell(Tcp.Write.Create(next, WriteAck.Instance)); } else { _writePending = false; if (_closeAfterWrite != null) { _connection.Tell(_closeAfterWrite); } } }).With <ClientRead>(r => { _readTo = r.ReadTo; _toRead = r.Count; _connection.Tell(Tcp.ResumeReading.Instance); }).With <Tcp.Received>(r => { _readBuffer += r.Data; if (_readBuffer.Count >= _toRead) { _readTo.Tell(new ReadResult(_readBuffer)); _readBuffer = ByteString.Empty; _toRead = 0; _readTo = Context.System.DeadLetters; } else { _connection.Tell(Tcp.ResumeReading.Instance); } }).With <PingClose>(p => { _readTo = p.Requester; _connection.Tell(Tcp.ResumeReading.Instance); }).With <Tcp.ConnectionClosed>(c => { _readTo.Tell(c); if (!c.IsPeerClosed) { Context.Stop(Self); } }).With <ClientClose>(c => { if (!_writePending) { _connection.Tell(c.Cmd); } else { _closeAfterWrite = c.Cmd; } }); }
public ClientClose(Tcp.CloseCommand cmd) { Cmd = cmd; }
protected override void OnReceive(object message) { message.Match().With<ClientWrite>(w => { if (!_writePending) { _writePending = true; _connection.Tell(Tcp.Write.Create(w.Bytes, WriteAck.Instance)); } else _queuedWrites.Enqueue(w.Bytes); }).With<WriteAck>(() => { if (_queuedWrites.Count != 0) { var next = _queuedWrites.Dequeue(); _connection.Tell(Tcp.Write.Create(next, WriteAck.Instance)); } else { _writePending = false; if(_closeAfterWrite != null) _connection.Tell(_closeAfterWrite); } }).With<ClientRead>(r => { _readTo = r.ReadTo; _toRead = r.Count; _connection.Tell(Tcp.ResumeReading.Instance); }).With<Tcp.Received>(r => { _readBuffer += r.Data; if (_readBuffer.Count >= _toRead) { _readTo.Tell(new ReadResult(_readBuffer)); _readBuffer = ByteString.Empty; _toRead = 0; _readTo = Context.System.DeadLetters; } else _connection.Tell(Tcp.ResumeReading.Instance); }).With<PingClose>(p => { _readTo = p.Requester; _connection.Tell(Tcp.ResumeReading.Instance); }).With<Tcp.ConnectionClosed>(c => { _readTo.Tell(c); if(!c.IsPeerClosed) Context.Stop(Self); }).With<ClientClose>(c => { if (!_writePending) _connection.Tell(c.Cmd); else _closeAfterWrite = c.Cmd; }); }