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!!!!!!")); } }
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); }