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