Пример #1
0
        public override void OnReceived(IConnection connection, NetworkBuffer buffer, int offset, int count)
        {
            NetworkBuffer msgBuffer = buffer;

            //NetworkBuffer msgBuffer = new NetworkBuffer(NetworkParameters._MAX_UNCOMPRESS_MESSAGE_SIZE, true);
            //msgBuffer.WriteBytes(buffer, offset, count);

            try
            {
                while (msgBuffer.Readable)
                {
                    int  oldReaderOffset = msgBuffer.ReadOffset;
                    int  msgCount        = 0;
                    bool result          = Decode(msgBuffer, ref msgCount);
                    if (result == false)
                    {
                        if (oldReaderOffset == msgBuffer.ReadOffset)
                        {
                            // Seems like more data is required.
                            // Let us wait for the next notification.
                            break;
                        }
                        else
                        {
                            // Previous data has been discarded.
                            // Probably it is reading on.
                            continue;
                        }
                    }
                    else if (msgCount == 0)
                    {
                        throw new InvalidOperationException(
                                  "decode() method must read at least one byte " +
                                  "if it returned a frame ");
                    }

                    try
                    {
                        FireBuffReceived(connection, msgBuffer, msgBuffer.ReadOffset, msgCount);
                    }
                    finally
                    {
                        msgBuffer.DiscardReadBytes();
                    }
                }
            }
            catch (Exception e)
            {
                Logger.Debug(e.Message);
                Logger.Debug(e.StackTrace);
            }
        }
Пример #2
0
 public void CallDecode(Connection connection)
 {
     while (networkBuffer.Readable)
     {
         int oldReaderOffset = networkBuffer.ReadOffset;
         //try to decode
         bool result = Decode(connection);
         if (result == false)
         {
             if (oldReaderOffset == networkBuffer.ReadOffset)
             {
                 // wait to receive more data
                 break;
             }
             else
             {
                 // Previous data has been discarded.
                 // Probably it is reading on.
                 //never be here -- wind
                 continue;
             }
         }
         else if (msgCount == 0)
         {
             throw new InvalidOperationException(
                       "decode() method must read at least one byte " +
                       "if it returned a frame ");
         }
         try
         {
             if (connection.netHandler != null)
             {
                 connection.netHandler.OnReceived(connection, networkBuffer.ToArray(), msgInitOffset, msgCount);
             }
             else
             {
                 connection.OnReceived(connection, networkBuffer.ToArray(), msgInitOffset, msgCount);
             }
         }
         finally
         {
             networkBuffer.ReadOffset = msgInitOffset + msgCount;
             networkBuffer.DiscardReadBytes();
         }
     }
 }
Пример #3
0
        public override void OnReceived(IConnection connection, byte[] buffer, int offset, int count)
        {
            if (msgBuffer == null)
            {
                msgBuffer = new NetworkBuffer(NetworkParameters.MaxCompressMessageSize, true);
            }
            msgBuffer.Write(buffer, offset, count);

            try
            {
                while (msgBuffer.Readable)
                {
                    int readOffset = msgBuffer.ReadOffset;
                    int num        = 0;
                    if (!Decode(msgBuffer, ref num))
                    {
                        if (readOffset == msgBuffer.ReadOffset)
                        {
                            break;
                        }
                    }
                    else
                    {
                        if (num == 0)
                        {
                            throw new InvalidOperationException("decode() method must read at least one byte if it returned a frame ");
                        }

                        try
                        {
                            FireBuffReceived(connection, msgBuffer.GetBuffer(), msgBuffer.ReadOffset, num);
                        }
                        finally
                        {
                            msgBuffer.ReadOffset = msgBuffer.ReadOffset + num;
                            msgBuffer.DiscardReadBytes();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LoggerManager.Instance.Info("OnReceived connection {0} catch Exception {1}", connection.ToString(), ex.ToString());
            }
        }