Medusa.Network.Service.TcpClientMessageService.OnHandleRead C# (CSharp) Method

OnHandleRead() protected method

protected OnHandleRead ( ) : void
return void
        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");
                        }

                    }

                }
            }
        }