public void process(byte[] datas, MessageLengthEx offset, MessageLengthEx length) { MessageLengthEx totallen = offset; while(length > 0 && expectSize > 0) { if(state == READ_STATE.READ_STATE_MSGID) { if(length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; msgid = stream.readUint16(); stream.clear(); Message msg = Message.clientMessages[msgid]; if(msg.msglen == -1) { state = READ_STATE.READ_STATE_MSGLEN; expectSize = 2; } else { expectSize = (MessageLengthEx)msg.msglen; state = READ_STATE.READ_STATE_BODY; } } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if(state == READ_STATE.READ_STATE_MSGLEN) { if(length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; msglen = stream.readUint16(); stream.clear(); // 长度扩展 if(msglen >= 65535) { state = READ_STATE.READ_STATE_MSGLEN_EX; expectSize = 4; } else { state = READ_STATE.READ_STATE_BODY; expectSize = msglen; } } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if(state == READ_STATE.READ_STATE_MSGLEN_EX) { if(length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; expectSize = stream.readUint32(); stream.clear(); state = READ_STATE.READ_STATE_BODY; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if(state == READ_STATE.READ_STATE_BODY) { if(length >= expectSize) { stream.append (datas, totallen, expectSize); totallen += expectSize; length -= expectSize; Message msg = Message.clientMessages[msgid]; #if UNITY_EDITOR Dbg.profileStart(msg.name); #endif msg.handleMessage(stream); #if UNITY_EDITOR Dbg.profileEnd(msg.name); #endif stream.clear(); state = READ_STATE.READ_STATE_MSGID; expectSize = 2; } else { stream.append (datas, totallen, length); expectSize -= length; break; } } } }
public void process(byte[] datas, MessageLength length) { MessageLength totallen = 0; while(length > 0 && expectSize > 0) { if(state == READ_STATE.READ_STATE_MSGID) { if(length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); length -= expectSize; expectSize = 0; msgid = stream.readUint16(); stream.clear(); Message msg = Message.clientMessages[msgid]; if(msg.msglen == -1) { state = READ_STATE.READ_STATE_MSGLEN; expectSize = 2; } else { state = READ_STATE.READ_STATE_BODY; expectSize = (MessageLength)msg.msglen; } totallen += 2; //Dbg.DEBUG_MSG(string.Format("MessageReader::process(): msgid={0}/{1}/{2}, msgname={3}!", // msg.id, msg.msglen, expectSize, msg.name)); } else { expectSize -= length; Array.Copy(datas, totallen, stream.data(), stream.wpos, length); // totallen += length; // Ҫ�˳�ѭ����������һ�� length = 0; break; } } else if(state == READ_STATE.READ_STATE_MSGLEN) { if(length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); length -= expectSize; msglen = stream.readUint16(); stream.clear(); // Dbg.DEBUG_MSG(string.Format("MessageReader::process(): msglen={0}!", msglen)); state = READ_STATE.READ_STATE_BODY; expectSize = msglen; totallen += 2; } else { expectSize -= length; Array.Copy(datas, totallen, stream.data(), stream.wpos, length); // totallen += length; // Ҫ�˳�ѭ����������һ�� length = 0; break; } } else if(state == READ_STATE.READ_STATE_BODY) { if(length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); length -= expectSize; totallen += expectSize; Message msg = Message.clientMessages[msgid]; stream.wpos += expectSize; // Dbg.DEBUG_MSG(string.Format("MessageReader::process(): handleMessage={0}, msglen={1}, rpos({2}), wpos({3}), msg={4}!", // msg.name, stream.opsize(), stream.rpos, stream.wpos, stream.toString())); msg.handleMessage(stream); stream.clear(); state = READ_STATE.READ_STATE_MSGID; expectSize = 2; } else { expectSize -= length; Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += length; // totallen += length; // Ҫ�˳�ѭ����������һ�� length = 0; break; } } } }
public void process(byte[] datas, MessageLength length, Dictionary <uint, MessageHandler> flowHandler) { //Log.Net("process receive Data " + length + " state " + state); MessageLength totallen = 0; while (length > 0 && expectSize > 0) { if (state == READ_STATE.READ_STATE_FLAG) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; flag = stream.readUint8(); stream.clear(); state = READ_STATE.READ_STATE_MSGLEN; expectSize = 4; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MSGLEN) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; msglen = stream.readUint32(); stream.clear(); state = READ_STATE.READ_STATE_FLOWID; expectSize = 4; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_FLOWID) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; flowId = stream.readUint32(); stream.clear(); state = READ_STATE.READ_STATE_MODULEID; expectSize = 1; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MODULEID) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; moduleId = stream.readUint8(); stream.clear(); state = READ_STATE.READ_STATE_MSGID; expectSize = 2; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MSGID) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; msgid = stream.readUint16(); stream.clear(); state = READ_STATE.READ_STATE_RESPONSE_TIME; expectSize = 4; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_RESPONSE_TIME) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; responseTime = stream.readUint32(); stream.clear(); state = READ_STATE.READ_STATE_RESPONSE_FLAG; expectSize = 2; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_RESPONSE_FLAG) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; responseFlag = stream.readInt16(); stream.clear(); state = READ_STATE.READ_STATE_BODY; expectSize = msglen - 4 - 1 - 2 - 4 - 2; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } /* * body Can be empty */ if (state == READ_STATE.READ_STATE_BODY) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; /* * No Handler Or PushMessage forward To IPacketHandler * Call Who's RPC Method Or Register Many RPC Method to Handle It ? * [PushHandler] * void GCPushSpriteInfo(Packet packet) { * } * * PacketHandler namespace * IPacketHandler---->GCPushSpriteInfo */ MessageHandler handler = null; if (flowHandler == null) { handler = msgHandle; } else if (flowHandler.ContainsKey(flowId)) { handler = flowHandler [flowId]; flowHandler.Remove(flowId); } //Message msg = new Message(); IMessageLite pbmsg = KBEngine.Message.handlePB(moduleId, msgid, stream); Packet p = new Packet(flag, msglen, flowId, moduleId, msgid, responseTime, responseFlag, pbmsg); var fullName = pbmsg.GetType().FullName; //Bundle.recvMsg.Add("recvMsg " + fullName + " : " + flowId); //Log.Net("RecvMsg: "+fullName+" f "+flowId); if (fullName.Contains("Push")) { //Log.Net("MessageReader Handler PushMessage"); if (mainLoop != null) { mainLoop.queueInLoop(delegate { var handlerName = fullName.Replace("ChuMeng", "PacketHandler"); var tp = Type.GetType(handlerName); if (tp == null) { Debug.LogError("PushMessage noHandler " + handlerName); } else { //Debug.Log("Handler Push Message here "+handlerName); var ph = (PacketHandler.IPacketHandler)Activator.CreateInstance(tp); ph.HandlePacket(p); } }); } } else if (handler != null) { mainLoop.queueInLoop(() => { handler(p); }); } else { //flowHandler.Remove(flowId); Debug.LogError("MessageReader::process No handler for flow Message " + msgid + " " + flowId + " " + pbmsg.GetType() + " " + pbmsg); } stream.clear(); state = READ_STATE.READ_STATE_FLAG; expectSize = 1; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } } if (responseFlag != 0) { Debug.LogError("MessageReader:: read Error Packet " + responseFlag); } //Log.Net("current state after " + state + " msglen " + msglen + " " + length); //Log.Net("MessageReader:: prop flag" + flag + " msglen " + msglen + " flowId " + flowId + " moduleId " + moduleId + " msgid " + msgid + " responseTime " + responseTime + " responseFlag " + responseFlag + " expectSize " + expectSize); }
public void process(byte[] datas, MessageLength length) { MessageLength totallen = 0; while(length > 0 && expectSize > 0) { if(state == READ_STATE.READ_STATE_MSGID) { if(length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += expectSize; length -= expectSize; msgid = stream.readUint16(); stream.clear(); Message msg = Message.clientMessages[msgid]; if(msg.msglen == -1) { state = READ_STATE.READ_STATE_MSGLEN; expectSize = 2; } else { state = READ_STATE.READ_STATE_BODY; expectSize = (MessageLength)msg.msglen; } } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } else if(state == READ_STATE.READ_STATE_MSGLEN) { if(length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += expectSize; length -= expectSize; msglen = stream.readUint16(); stream.clear(); state = READ_STATE.READ_STATE_BODY; expectSize = msglen; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } else if(state == READ_STATE.READ_STATE_BODY) { if(length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += expectSize; length -= expectSize; Message msg = Message.clientMessages[msgid]; msg.handleMessage(stream); stream.clear(); state = READ_STATE.READ_STATE_MSGID; expectSize = 2; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } } }
public void process(byte[] datas, MessageLength length) { MessageLength totallen = 0; while (length > 0 && expectSize > 0) { if (state == READ_STATE.READ_STATE_MSGID) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); length -= expectSize; expectSize = 0; msgid = stream.readUint16(); stream.clear(); Message msg = Message.clientMessages[msgid]; if (msg.msglen == -1) { state = READ_STATE.READ_STATE_MSGLEN; expectSize = 2; } else { state = READ_STATE.READ_STATE_BODY; expectSize = (MessageLength)msg.msglen; } totallen += 2; //Dbg.DEBUG_MSG(string.Format("MessageReader::process(): msgid={0}/{1}/{2}, msgname={3}!", // msg.id, msg.msglen, expectSize, msg.name)); } else { expectSize -= length; Array.Copy(datas, totallen, stream.data(), stream.wpos, length); // totallen += length; // 要退出循环了无序这一步 length = 0; break; } } else if (state == READ_STATE.READ_STATE_MSGLEN) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); length -= expectSize; msglen = stream.readUint16(); stream.clear(); // Dbg.DEBUG_MSG(string.Format("MessageReader::process(): msglen={0}!", msglen)); state = READ_STATE.READ_STATE_BODY; expectSize = msglen; totallen += 2; } else { expectSize -= length; Array.Copy(datas, totallen, stream.data(), stream.wpos, length); // totallen += length; // 要退出循环了无序这一步 length = 0; break; } } else if (state == READ_STATE.READ_STATE_BODY) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); length -= expectSize; totallen += expectSize; Message msg = Message.clientMessages[msgid]; stream.wpos += expectSize; // Dbg.DEBUG_MSG(string.Format("MessageReader::process(): handleMessage={0}, msglen={1}, rpos({2}), wpos({3}), msg={4}!", // msg.name, stream.opsize(), stream.rpos, stream.wpos, stream.toString())); msg.handleMessage(stream); stream.clear(); state = READ_STATE.READ_STATE_MSGID; expectSize = 2; } else { expectSize -= length; Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += length; // totallen += length; // 要退出循环了无序这一步 length = 0; break; } } } }
public MessageReader() { expectSize = 1; state = READ_STATE.READ_STATE_FLAG; }
public ServerMsgReader() { expectSize = 1; state = READ_STATE.READ_STATE_FLAG; }
public override void process(byte[] datas, MessageLengthEx offset, MessageLengthEx length) { MessageLengthEx totallen = offset; while (length > 0 && expectSize > 0) { if (state == READ_STATE.READ_STATE_MSGID) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; msgid = stream.readUint16(); stream.clear(); Message msg = Messages.clientMessages[msgid]; if (msg.msglen == -1) { state = READ_STATE.READ_STATE_MSGLEN; expectSize = 2; } else if (msg.msglen == 0) { // 如果是0个参数的消息,那么没有后续内容可读了,处理本条消息并且直接跳到下一条消息 #if UNITY_EDITOR Dbg.profileStart(msg.name); #endif msg.handleMessage(stream); #if UNITY_EDITOR Dbg.profileEnd(msg.name); #endif state = READ_STATE.READ_STATE_MSGID; expectSize = 2; } else { expectSize = (MessageLengthEx)msg.msglen; state = READ_STATE.READ_STATE_BODY; } } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MSGLEN) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; msglen = stream.readUint16(); stream.clear(); // 长度扩展 if (msglen >= 65535) { state = READ_STATE.READ_STATE_MSGLEN_EX; expectSize = 4; } else { state = READ_STATE.READ_STATE_BODY; expectSize = msglen; } } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MSGLEN_EX) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; expectSize = stream.readUint32(); stream.clear(); state = READ_STATE.READ_STATE_BODY; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_BODY) { if (length >= expectSize) { stream.append(datas, totallen, expectSize); totallen += expectSize; length -= expectSize; Message msg = Messages.clientMessages[msgid]; #if UNITY_EDITOR Dbg.profileStart(msg.name); #endif msg.handleMessage(stream); #if UNITY_EDITOR Dbg.profileEnd(msg.name); #endif stream.clear(); state = READ_STATE.READ_STATE_MSGID; expectSize = 2; } else { stream.append(datas, totallen, length); expectSize -= length; break; } } } }
public MessageReader() { m_expectSize = 2; m_state = READ_STATE.READ_STATE_SENDID; }
public void Process(byte[] datas, System.UInt32 length) { System.UInt32 totallength = 0; while (length > 0 && m_expectSize > 0) { if (m_state == READ_STATE.READ_STATE_SENDID) //读取SendID, 消息发送者ID { if (length >= m_expectSize) { Array.Copy(datas, totallength, m_stream.Data, m_stream.wpos, m_expectSize); totallength += m_expectSize; m_stream.wpos += m_expectSize; length -= m_expectSize; m_sendId = m_stream.ReadUInt16(); m_stream.Clear(); m_state = READ_STATE.READ_STATE_NODEID; m_expectSize = 2; } else { Array.Copy(datas, totallength, m_stream.Data, m_stream.wpos, length); m_stream.wpos += length; m_expectSize -= length; break; } } else if (m_state == READ_STATE.READ_STATE_NODEID) //读取NodeID, 消息接收者ID { if (length >= m_expectSize) { Array.Copy(datas, totallength, m_stream.Data, m_stream.wpos, m_expectSize); totallength += m_expectSize; m_stream.wpos += m_expectSize; length -= m_expectSize; m_nodeId = m_stream.ReadUInt16(); m_stream.Clear(); m_state = READ_STATE.READ_STATE_FIRSTID; m_expectSize = 2; } else { Array.Copy(datas, totallength, m_stream.Data, m_stream.wpos, length); m_stream.wpos += length; m_expectSize -= length; break; } } else if (m_state == READ_STATE.READ_STATE_FIRSTID) //读取FirstID { if (length >= m_expectSize) { Array.Copy(datas, totallength, m_stream.Data, m_stream.wpos, m_expectSize); totallength += m_expectSize; m_stream.wpos += m_expectSize; length -= m_expectSize; m_firstId = m_stream.ReadUInt16(); m_stream.Clear(); m_state = READ_STATE.READ_STATE_SECONDID; m_expectSize = 2; } else { Array.Copy(datas, totallength, m_stream.Data, m_stream.wpos, length); m_stream.wpos += length; m_expectSize -= length; break; } } else if (m_state == READ_STATE.READ_STATE_SECONDID) //读取SecondID { if (length >= m_expectSize) { Array.Copy(datas, totallength, m_stream.Data, m_stream.wpos, m_expectSize); totallength += m_expectSize; m_stream.wpos += m_expectSize; length -= m_expectSize; m_secondId = m_stream.ReadUInt16(); m_stream.Clear(); m_state = READ_STATE.READ_STATE_SIZE; m_expectSize = 2; } else { Array.Copy(datas, totallength, m_stream.Data, m_stream.wpos, length); m_stream.wpos += length; m_expectSize -= length; break; } } else if (m_state == READ_STATE.READ_STATE_SIZE) //读取Size大小 { if (length >= m_expectSize) { Array.Copy(datas, totallength, m_stream.Data, m_stream.wpos, m_expectSize); totallength += m_expectSize; m_stream.wpos += m_expectSize; length -= m_expectSize; m_msgLen = m_stream.ReadUInt16(); m_stream.Clear(); m_state = READ_STATE.READ_STATE_BODY; m_expectSize = m_msgLen; //msglen大小表示后边数据部分的大小 } else { Array.Copy(datas, totallength, m_stream.Data, m_stream.wpos, length); m_stream.wpos += length; m_expectSize -= length; break; } } if (m_state == READ_STATE.READ_STATE_BODY) //读取数据包真实数据部分 { if (length >= m_expectSize) { Array.Copy(datas, totallength, m_stream.Data, m_stream.wpos, m_expectSize); totallength += m_expectSize; m_stream.wpos += m_expectSize; length -= m_expectSize; byte[] bytes = new byte[m_stream.wpos]; Array.Copy(m_stream.Data, 0, bytes, 0, bytes.Length); if (BitConverter.IsLittleEndian) { Array.Reverse(bytes, 0, bytes.Length); } Packet p = new Packet(m_sendId, m_nodeId, m_firstId, m_secondId, m_msgLen, bytes); if (m_messageHandler != null) { m_messageHandler(p); } m_stream.Clear(); m_state = READ_STATE.READ_STATE_SENDID; m_expectSize = 2; } else { Array.Copy(datas, totallength, m_stream.Data, m_stream.wpos, length); m_stream.wpos += length; m_expectSize -= length; break; } } } }
public void Reset() { expectSize = 1; state = READ_STATE.READ_STATE_FLAG; }
public PacketReader() { m_expectSize = 2; m_state = READ_STATE.READ_STATE_SENDID; }
public void Process(byte[] datas, System.UInt32 length, Dictionary <uint, MessageHandler> flowHandlerDict) { System.UInt32 readStartIndex = 0; while (length > 0 && expectSize > 0) { if (state == READ_STATE.READ_STATE_FLAG) { if (length >= expectSize) { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, expectSize); readStartIndex += expectSize; stream.wpos += expectSize; length -= expectSize; flag = stream.ReadByte(); stream.Clear(); //不懂, 为何要清空stream的位置计数 state = READ_STATE.READ_STATE_MSGLEN; expectSize = 4; //下个数据是报文总长度 } else { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MSGLEN) { if (length >= expectSize) { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, expectSize); readStartIndex += expectSize; stream.wpos += expectSize; length -= expectSize; msglen = stream.ReadUInt32(); stream.Clear(); state = READ_STATE.READ_STATE_FLOWID; expectSize = 4; } else { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_FLOWID) { if (length >= expectSize) { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, expectSize); readStartIndex += expectSize; stream.wpos += expectSize; length -= expectSize; flowId = stream.ReadUInt32(); stream.Clear(); state = READ_STATE.READ_STATE_MODULEID; expectSize = 1; } else { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MODULEID) { if (length >= expectSize) { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, expectSize); readStartIndex += expectSize; stream.wpos += expectSize; length -= expectSize; moduleId = stream.ReadByte(); stream.Clear(); state = READ_STATE.READ_STATE_MSGID; expectSize = 2; } else { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MSGID) { if (length >= expectSize) { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, expectSize); readStartIndex += expectSize; stream.wpos += expectSize; length -= expectSize; msgId = stream.ReadUInt16(); stream.Clear(); state = READ_STATE.READ_STATE_RESPONSE_TIME; expectSize = 4; } else { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_RESPONSE_TIME) { if (length >= expectSize) { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, expectSize); readStartIndex += expectSize; stream.wpos += expectSize; length -= expectSize; responseTime = stream.ReadUInt32(); stream.Clear(); state = READ_STATE.READ_STATE_RESPONSE_FLAG; expectSize = 2; } else { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_RESPONSE_FLAG) { if (length >= expectSize) { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, expectSize); readStartIndex += expectSize; stream.wpos += expectSize; length -= expectSize; responseFlag = stream.ReadInt16(); stream.Clear(); state = READ_STATE.READ_STATE_BODY; expectSize = msglen - 4 - 1 - 2 - 4 - 2; } else { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } if (state == READ_STATE.READ_STATE_BODY) { if (length >= expectSize) { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, expectSize); readStartIndex += expectSize; stream.wpos += expectSize; length -= expectSize; //获取到响应报文对应的回调执行方法 MessageHandler handler = null; if (flowHandlerDict == null) { handler = null; } else if (flowHandlerDict.ContainsKey(flowId)) { handler = flowHandlerDict[flowId]; flowHandlerDict.Remove(flowId); } else { handler = null; } //将获取到的数据,封装成Packet包 Packet packet = new Packet(flag, msglen, flowId, moduleId, msgId, responseTime, responseFlag, stream.GetBytes(stream.rpos, stream.wpos - stream.rpos)); if (packet.protobufMessageClassName.Contains("Push")) { //接收到服务器主动推送(Push)的消息,需反射指定对应的类来进行相应的处理 MainLoop.QueueInLoop(() => { Debug.Log("接收到了Push消息."); }); } else if (handler != null) { //接收到请求响应的消息, 用handler来进行处理 MainLoop.QueueInLoop(() => handler(packet)); } else { Debug.LogError("客户端接收到一个无法处理的数据报文. ModuleId: " + moduleId + ", MessageId: " + msgId); } //stream.Clear(); state = READ_STATE.READ_STATE_FLAG; expectSize = 1; } else { Array.Copy(datas, readStartIndex, stream.Data, stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } } if (responseFlag != 0) { Debug.LogError("MessageReader:: read error packet " + responseFlag); } }
public MessageReader() { expectSize = 2; state = READ_STATE.READ_STATE_MSGLEN; }
public void Reset() { Debug.LogError("Reset Server MsgReader"); expectSize = 1; state = READ_STATE.READ_STATE_FLAG; }
//该类的核心就是process函数,一种基于if else的状态机机制,而且if else具有优先级的特性,可以继续下去 //datas是整个缓冲区的大小,length是其中数据的长度,flowHandler是可能的处理函数 public void process(byte[] datas, uint length, System.Collections.Generic.Dictionary <uint, MessageHandler> flowHandler) { //Debug.LogError("process receive Data " + length + " state " + state+" expect "+expectSize); uint totallen = 0; //这里把totallen设置为局部变量就表明 while (length > 0 && expectSize > 0) { if (state == READ_STATE.READ_STATE_MSGLEN) //读取msg长度的模式 { if (length >= expectSize) //如果缓冲区数据长度大于可读取长度 { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); //够长就直接拷贝数据Copy(Array sourceArray, long sourceIndex, Array destinationArray, long destinationIndex, long length); totallen += expectSize; //totallen是记录从网络上读取缓冲区的长度 stream.wpos += (int)expectSize; //stream.wpos是写入目标缓冲区的偏移量 length -= expectSize; //length是网络数据缓冲区的剩余长度 msglen = stream.readUint16(); //读取msglen stream.clear(); //清空本地缓冲区 state = READ_STATE.READ_STATE_FLOWID; //改变接下来要读取的状态 expectSize = 1; //接下来要读取的数据长度大小 } else //如果不够读取的话,先读取length长度的数据,更新wpos和expectSize的大小,等待下一次读取 { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_FLOWID) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; flowId = stream.readUint8(); stream.clear(); state = READ_STATE.READ_STATE_MODULEID; expectSize = 1; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MODULEID) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; moduleId = stream.readUint8(); stream.clear(); state = READ_STATE.READ_STATE_MSGID; expectSize = 1; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MSGID) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; msgid = stream.readUint8(); stream.clear(); state = READ_STATE.READ_STATE_RESPONSE_FLAG; expectSize = 1; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_RESPONSE_FLAG) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; responseFlag = stream.readUint8(); stream.clear(); state = READ_STATE.READ_STATE_BODY; //expectSize = msglen - 4 - 1 - 2 - 4 - 2; expectSize = (uint)(msglen - 1 - 1 - 1 - 1);//flowId moduleId msgId } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } /* * body Can be empty */ if (state == READ_STATE.READ_STATE_BODY) //真正的Body消息体 { //Debug.LogError("body expect BodySize:"+length+" expSize "+expectSize); if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; /* * No Handler Or PushMessage forward To IPacketHandler * Call Who's RPC Method Or Register Many RPC Method to Handle It ? * [PushHandler] * void GCPushSpriteInfo(Packet packet) { * } * * PacketHandler namespace * IPacketHandler---->GCPushSpriteInfo */ IMessageLite pbmsg = MyLib.Util.GetMsg(moduleId, msgid, stream.getBytString()); //通过moduleId,msgid找到对于的proto结构,然后把stream中的内容调用proto的库转换为proto结构 //Debug.LogError("expect msgType: "+pbmsg.GetType()); Packet p = new Packet(msglen, flowId, moduleId, msgid, responseFlag, pbmsg); var fullName = pbmsg.GetType().FullName; mainLoop.queueInLoop(() => //这里的mainloop就是用MonoBehaviour开出来的模拟线程 { Debug.Log("ReadPacket: " + p.protoBody.ToString()); }); mainLoop.queueInLoop(() => //放到Mainloop中进行消息处理 { MessageHandler handler = null; if (flowHandler == null) { handler = msgHandle; //msgHandle由RemoteClient提供 } else if (flowHandler.ContainsKey(flowId)) //如果需要对该flowId特殊处理,在这里完成,对于由客户端发起带有Flowid的消息,服务器会回一个同样Flowid的消息 { handler = flowHandler[flowId]; flowHandler.Remove(flowId); if (handler == null) { Debug.LogError("FlowHandlerIsNull: " + flowId); } } else { handler = msgHandle; //,默认也是由RemoteClient提供msgHandle处理 } if (handler != null) { handler(p); } else { Debug.LogError("MessageReader::process No handler for flow Message " + msgid + " " + flowId + " " + pbmsg.GetType() + " " + pbmsg); } }); //fullName是检测handlePB()中返回的继承该IMessageLite接口的类是否带有Push字段,带有该字段的协议是由服务器主动发起, //Debug.LogError("HandlerIs: "+flowId+" h "+handler); if (fullName.Contains("Push")) { //Log.Net("MessageReader Handler PushMessage"); if (mainLoop != null) { mainLoop.queueInLoop(delegate { var handlerName = fullName.Replace("MyLib", "PacketHandler"); var tp = Type.GetType(handlerName); //通过type的名字找到该Type if (tp == null) { Debug.LogError("PushMessage noHandler " + handlerName); } else { //Debug.Log("Handler Push Message here "+handlerName); var ph = (IPacketHandler)Activator.CreateInstance(tp); //Activator .CreateInstance()用于创建类的实例 ph.HandlePacket(p); //IPacketHandler提供了HandlePacket的方法,该IPacketHandler接口主要是对协议中的Push字段(服务器单方消息)进行处理的接口 } }); } } stream.clear(); state = READ_STATE.READ_STATE_MSGLEN; expectSize = 2; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } } if (responseFlag != 0) { Debug.LogError("MessageReader:: read Error Packet " + responseFlag); } //Log.Net("current state after " + state + " msglen " + msglen + " " + length); //Log.Net("MessageReader:: prop flag" + flag + " msglen " + msglen + " flowId " + flowId + " moduleId " + moduleId + " msgid " + msgid + " responseTime " + responseTime + " responseFlag " + responseFlag + " expectSize " + expectSize); }
public void process(byte[] datas, MessageLength length) { Debug.Log("process receive Data " + length + " state " + state); MessageLength totallen = 0; while (length > 0 && expectSize > 0) { if (state == READ_STATE.READ_STATE_FLAG) //1 { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; flag = stream.readUint8(); stream.clear(); state = READ_STATE.READ_STATE_MSGLEN; expectSize = 4; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MSGLEN) //4 { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; msglen = stream.readUint32(); stream.clear(); state = READ_STATE.READ_STATE_FLOWID; expectSize = 4; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_FLOWID) //4 { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; flowId = stream.readUint32(); stream.clear(); state = READ_STATE.READ_STATE_MODULEID; expectSize = 1; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MODULEID) //1 { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; moduleId = stream.readUint8(); stream.clear(); state = READ_STATE.READ_STATE_MSGID; expectSize = 2; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MSGID) //2 { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; msgid = stream.readUint16(); stream.clear(); state = READ_STATE.READ_STATE_BODY; expectSize = msglen - 4 - 1 - 2; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } /* * body Can be empty handle body immediately */ if (state == READ_STATE.READ_STATE_BODY) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += (int)expectSize; length -= expectSize; /* * No Handler Or PushMessage forward To IPacketHandler * Call Who's RPC Method Or Register Many RPC Method to Handle It ? * [PushHandler] * void GCPushSpriteInfo(Packet packet) { * } * * PacketHandler namespace * IPacketHandler---->GCPushSpriteInfo */ MyLib.ServerMsgReader.MessageHandler handler = msgHandle; //KBEngine.Message msg = new KBEngine.Message(); IMessageLite pbmsg = KBEngine.Message.handlePB(moduleId, msgid, stream); KBEngine.Packet p = new KBEngine.Packet(flag, msglen, flowId, moduleId, msgid, 0, 0, pbmsg); //var fullName = pbmsg.GetType().FullName; KBEngine.KBEngineApp.app.queueInLoop(delegate() { handler(p); }); stream.clear(); state = READ_STATE.READ_STATE_FLAG; expectSize = 1; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += (int)length; expectSize -= length; break; } } } Debug.Log("server state after " + state + " msglen " + msglen + " " + length); Debug.Log(" server MessageReader:: prop flag" + flag + " msglen " + msglen + " flowId " + flowId + " moduleId " + moduleId + " msgid " + msgid + " responseTime " + 0 + " responseFlag " + 0 + " expectSize " + expectSize); }
public void process(byte[] datas, MessageLength length) { MessageLength totallen = 0; while (length > 0 && expectSize > 0) { if (state == READ_STATE.READ_STATE_MSGID) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += expectSize; length -= expectSize; msgid = stream.readUint16(); stream.clear(); Message msg = Message.clientMessages[msgid]; if (msg.msglen == -1) { state = READ_STATE.READ_STATE_MSGLEN; expectSize = 2; } else { state = READ_STATE.READ_STATE_BODY; expectSize = (MessageLength)msg.msglen; } } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_MSGLEN) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += expectSize; length -= expectSize; msglen = stream.readUint16(); stream.clear(); state = READ_STATE.READ_STATE_BODY; expectSize = msglen; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } else if (state == READ_STATE.READ_STATE_BODY) { if (length >= expectSize) { Array.Copy(datas, totallen, stream.data(), stream.wpos, expectSize); totallen += expectSize; stream.wpos += expectSize; length -= expectSize; Message msg = Message.clientMessages[msgid]; msg.handleMessage(stream); stream.clear(); state = READ_STATE.READ_STATE_MSGID; expectSize = 2; } else { Array.Copy(datas, totallen, stream.data(), stream.wpos, length); stream.wpos += length; expectSize -= length; break; } } } }
public ServerMsgReader() { expectSize = 2; state = READ_STATE.READ_STATE_MSGLEN; }