protected void OnHandleRead() { mHeartbeatWatch.Start(); OnRead?.Invoke(this, new TcpClientDataEventArgs <NetworkBuffer>(mTcpClient, mReadBuffer)); if (mReadBuffer.ReadableCount >= 4) { uint size = mReadBuffer.PeekUInt(); if (size <= mReadBuffer.ReadableCount - 4) { mReadBuffer.Retrieve(4); uint fromServiceId = mReadBuffer.ReadUInt(); uint toServiceId = mReadBuffer.ReadUInt(); uint version = mReadBuffer.ReadUInt(); uint id = mReadBuffer.ReadUInt(); uint sessionId = mReadBuffer.ReadUInt(); uint connectionId = mReadBuffer.ReadUInt(); var data = mReadBuffer.ReadData((int)size - 4 * 6); if (id != 0) { //request from client IMessage message = MessageFactory.Create(id); if (message != null) { message.FromService = fromServiceId; message.ToService = toServiceId; message.Version = version; message.Id = id; message.SessionId = sessionId; message.ConnectionId = connectionId; message.DeserializeRequest(new ArraySegment <byte>(data)); message.OnRequest(this); //resend back if (message.SessionId != 0) { uint temp = message.FromService; message.FromService = message.ToService; message.ToService = temp; message.Id = 0; //indicate response Write(message); } } else { Logger.ErrorLine("Invalid message id:{0}", id); } } else { //response from server if (sessionId != 0) { IMessage outPrevMessage; if (mMessages.TryGetValue(sessionId, out outPrevMessage)) { mMessages.Remove(sessionId); outPrevMessage.Id = 0; //indicate a response outPrevMessage.DeserializeResponse(new ArraySegment <byte>(data)); outPrevMessage.OnResponse(this); } else { Logger.ErrorLine("Error: Got a response after timeout.id:{0} sessionId:{1}", id, sessionId); } } else { Logger.ErrorLine("Error: ResponseMessage from server must have a session id"); } } } } }