示例#1
0
        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");
                        }
                    }
                }
            }
        }