Beispiel #1
0
        public override void OnReceived(IConnection connection, IRecvivedMessageInfo <CommandLineMessage> recvivedMessageInfo)
        {
            base.OnReceived(connection, recvivedMessageInfo);
            var cmd = recvivedMessageInfo.Message;

            System.Threading.Interlocked.Increment(ref count);

            switch (cmd.CmdName)
            {
            case "echo":
                recvivedMessageInfo.Reply(new CommandLineMessage("echo_reply", cmd.Parameters), connection);
                break;

            case "init":
                recvivedMessageInfo.Reply(new CommandLineMessage("init_reply", new[] { "ok" }), connection);
                break;

            default:
                recvivedMessageInfo.Reply(new CommandLineMessage("error unknow command "), connection);
                break;
            }
            if (count % 2000 == 100)
            {
                Console.WriteLine($"connection:\t{connection.ConnectionID}\t{recvivedMessageInfo.Message}");
                connection.BeginSend(new CommandLineMessage("hello!!!!!!"));
            }
        }
Beispiel #2
0
        public override void OnReceived(IConnection connection, IRecvivedMessageInfo <ThriftMessage> recvivedMessageInfo)
        {
            base.OnReceived(connection, recvivedMessageInfo);
            var cmd = recvivedMessageInfo.Message;

            System.Threading.Interlocked.Increment(ref count);
            var arr = cmd.Text.Split(' ');

            switch (arr[0])
            {
            case "echo":
                recvivedMessageInfo.Reply(new ThriftMessage(string.Join(" ", "echo_reply", arr[1], arr[2])), connection);
                break;

            case "init":
                recvivedMessageInfo.Reply(new ThriftMessage("init_reply ok"), connection);
                break;

            default:
                recvivedMessageInfo.Reply(new ThriftMessage("error unknow command "), connection);
                break;
            }
            if (count % 2000 == 100)
            {
                Console.WriteLine($"connection:\t{connection.ConnectionID}\t{recvivedMessageInfo.Message}");
                connection.BeginSend(new ThriftMessage("hello!!!!"));
            }
        }
 /// <summary>
 /// 当接收到客户端新消息时,会调用此方法.
 /// </summary>
 /// <param name="connection"></param>
 /// <param name="recvivedMessageInfo"></param>
 public virtual void OnReceived(SocketBase.IConnection connection, IRecvivedMessageInfo <TMessage> recvivedMessageInfo)
 {
 }
        /// <summary>
        /// parse
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="buffer"></param>
        /// <param name="maxMessageSize"></param>
        /// <param name="recvMessageInfo"></param>
        /// <param name="readlength"></param>
        /// <returns></returns>
        /// <exception cref="BadProtocolException">bad command line protocol</exception>
        public bool TryParse(IConnection connection, ArraySegment <byte> buffer, int maxMessageSize, out IRecvivedMessageInfo <CommandLineMessage> recvMessageInfo, out int readlength)
        {
            recvMessageInfo = null;
            readlength      = 0;

            if (buffer.Count < 2)
            {
                return(false);
            }

            //查找\r\n标记符
            for (int i = buffer.Offset, len = buffer.Offset + buffer.Count; i < len; i++)
            {
                if (buffer.Array[i] == 13 && i + 1 < len && buffer.Array[i + 1] == 10)
                {
                    readlength = i + 2 - buffer.Offset;

                    if (readlength == 2)
                    {
                        recvMessageInfo = new RecvivedMessageInfo <CommandLineMessage>(new CommandLineMessage(string.Empty), false); return(true);
                    }
                    if (readlength > maxMessageSize)
                    {
                        throw new BadProtocolException("message is too long");
                    }

                    string text  = Encoding.UTF8.GetString(buffer.Array, buffer.Offset, readlength - 2);
                    var    array = text.Split(SPLITER, StringSplitOptions.RemoveEmptyEntries);
                    var    queue = new Queue <string>(array);
                    recvMessageInfo = new RecvivedMessageInfo <CommandLineMessage>(ParseMessageText(queue, out var isSync, out int seqId), isSync, seqId);
                    return(true);
                }
            }
            readlength = 0;
            return(false);
        }
        /// <summary>
        /// parse
        /// </summary>
        /// <param name="connection"></param>
        /// <param name="buffer"></param>
        /// <param name="maxMessageSize"></param>
        /// <param name="recvivedMessageInfo"></param>
        /// <param name="readlength"></param>
        /// <returns></returns>
        /// <exception cref="BadProtocolException">bad thrift protocol</exception>
        public bool TryParse(IConnection connection, ArraySegment <byte> buffer, int maxMessageSize, out IRecvivedMessageInfo <TThriftMessage> recvivedMessageInfo, out int readlength)
        {
            recvivedMessageInfo = null;
            readlength          = 0;
            if (buffer.Count < 4)
            {
                return(false);
            }

            //获取message length
            var messageLength = Utils.NetworkBitConverter.ToInt32(buffer.Array, buffer.Offset);

            if (messageLength < 10)
            {
                throw new BadProtocolException("bad thrift protocol");
            }
            if (messageLength > maxMessageSize)
            {
                throw new BadProtocolException("message is too long");
            }

            readlength = messageLength + 4;
            if (buffer.Count < readlength)
            {
                readlength = 0;
                return(false);
            }

            bool isSync = BitConverter.ToBoolean(buffer.Array, buffer.Offset + 4);
            int  seqId  = Utils.NetworkBitConverter.ToInt32(buffer.Array, buffer.Offset + 5);

            var payload = new byte[messageLength - 6];

            Buffer.BlockCopy(buffer.Array, buffer.Offset + 10, payload, 0, payload.Length);
            var message = CreateThriftMessage(payload);

            recvivedMessageInfo = new RecvivedMessageInfo <TThriftMessage>(message, isSync, seqId);
            return(true);
        }