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;
					}
				}
			}
		}
示例#2
0
        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;
                    }
                }
            }
        }
示例#3
0
        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);
        }
示例#4
0
        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;
                    }
                }
            }
        }
示例#5
0
        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;
                    }
                }
            }
        }
示例#6
0
 public MessageReader()
 {
     expectSize = 1;
     state      = READ_STATE.READ_STATE_FLAG;
 }
示例#7
0
 public ServerMsgReader()
 {
     expectSize = 1;
     state      = READ_STATE.READ_STATE_FLAG;
 }
示例#8
0
        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;
 }
示例#12
0
 public PacketReader()
 {
     m_expectSize = 2;
     m_state      = READ_STATE.READ_STATE_SENDID;
 }
示例#13
0
        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);
            }
        }
示例#14
0
 public MessageReader()
 {
     expectSize = 2;
     state      = READ_STATE.READ_STATE_MSGLEN;
 }
示例#15
0
 public void Reset()
 {
     Debug.LogError("Reset Server MsgReader");
     expectSize = 1;
     state      = READ_STATE.READ_STATE_FLAG;
 }
示例#16
0
    //该类的核心就是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);
    }
示例#17
0
        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);
        }
示例#18
0
        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;
                    }
                }
            }
        }
示例#19
0
 public ServerMsgReader()
 {
     expectSize = 2;
     state      = READ_STATE.READ_STATE_MSGLEN;
 }