public void fini(bool issend) { if(numMessage > 0) { writeMsgLength(); if(stream != null) streamList.Add(stream); } if(issend) { numMessage = 0; msgtype = null; } }
public void newMessage(Message mt) { fini(false); msgtype = mt; numMessage += 1; writeUint16(msgtype.id); if(msgtype.msglen == -1) { writeUint16(0); messageLength = 0; } }
public void fini(bool issend) { if(numMessage > 0) { writeMsgLength(); streamList.Add(stream); stream = new MemoryStream(); } if(issend) { numMessage = 0; msgtype = null; } _curMsgStreamIndex = 0; }
public void onImportClientMessages(MemoryStream stream) { UInt16 msgcount = stream.readUint16(); Dbg.DEBUG_MSG(string.Format("KBEngine::Client_onImportClientMessages: start currserver=" + currserver + "(msgsize={0})...", msgcount)); while(msgcount > 0) { msgcount--; MessageID msgid = stream.readUint16(); Int16 msglen = stream.readInt16(); string msgname = stream.readString(); sbyte argstype = stream.readInt8(); Byte argsize = stream.readUint8(); List<Byte> argstypes = new List<Byte>(); for(Byte i=0; i<argsize; i++) { argstypes.Add(stream.readUint8()); } System.Reflection.MethodInfo handler = null; bool isClientMethod = msgname.Contains("Client_"); if(isClientMethod) { handler = typeof(KBEngineApp).GetMethod(msgname); if(handler == null) { Dbg.WARNING_MSG(string.Format("KBEngine::onImportClientMessages[{0}]: interface({1}/{2}/{3}) no implement!", currserver, msgname, msgid, msglen)); handler = null; } else { //Dbg.DEBUG_MSG(string.Format("KBEngine::onImportClientMessages: imported({0}/{1}/{2}) successfully!", // msgname, msgid, msglen)); } } if(msgname.Length > 0) { Message.messages[msgname] = new Message(msgid, msgname, msglen, argstype, argstypes, handler); //if(!isClientMethod) // Dbg.DEBUG_MSG(string.Format("KBEngine::onImportClientMessages[{0}]: imported({1}/{2}/{3}) successfully!", // currserver, msgname, msgid, msglen)); if(isClientMethod) { Message.clientMessages[msgid] = Message.messages[msgname]; } else { if(currserver == "loginapp") Message.loginappMessages[msgid] = Message.messages[msgname]; else Message.baseappMessages[msgid] = Message.messages[msgname]; } } else { Message msg = new Message(msgid, msgname, msglen, argstype, argstypes, handler); //if(!isClientMethod) // Dbg.DEBUG_MSG(string.Format("KBEngine::onImportClientMessages[{0}]: imported({1}/{2}/{3}) successfully!", // currserver, msgname, msgid, msglen)); if(currserver == "loginapp") Message.loginappMessages[msgid] = msg; else Message.baseappMessages[msgid] = msg; } }; onImportClientMessagesCompleted(); }
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 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 = 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; } } } }