Beispiel #1
0
 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;
         }
     });
 }
Beispiel #2
0
 public ClientClose(Tcp.CloseCommand cmd)
 {
     Cmd = cmd;
 }
Beispiel #3
0
 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;
     });
 }