/// <summary> /// 重载消息分发器 /// </summary> /// <param name="message"></param> public override void HandleMessage(ProtoBuf.IExtensible message) { if (this.sfs.Debug) { this.log.Info(new string[] { string.Concat(new object[] { "Message: ", message.GetType().FullName, " ", message }) }); } if (!this.requestHandlers.ContainsKey(message.GetType().FullName)) { this.log.Warn(new string[] { "Unknown message name: " + message.GetType().FullName }); } else { RequestProtoBufDelegate requestDelegate = this.requestHandlers[message.GetType().FullName]; requestDelegate(message); } }
/// <summary> /// 给服务器发送协议时 /// </summary> /// <param name="protocol"></param> public ProtocolItem(ProtoBuf.IExtensible protocol) { if (protocol != null) { if (ProtocolProxy.instance.IsLoginServer) { ProtocolId = (int)ProtocolConf.GetLoginServerIdByType(protocol.GetType()); } else { ProtocolId = (int)ProtocolConf.GetIdByType(protocol.GetType()); } Protocol = protocol; ProtocolItemBytes = ParseItem(); if (ProtocolConf.NeedShowMask(ProtocolId)) { Logic.UI.Mask.Contorller.MaskController.instance.ShowMask(); } } }
/// <summary> /// /// </summary> /// <param name="session"></param> /// <param name="message"></param> public static void SendMessage(IOSession session, int msgid, ProtoBuf.IExtensible message) { if (session != null) { session.WriteAndFlush(msgid, MessageSerialize(message)); } else { log.Error("session:为空 发送消息 " + message.GetType().FullName); } }
public void OnDataRead(ByteArray data, int msgNameLen) { if (data.Length == 0) { throw new AWError("Unexpected empty packet data: no readable bytes available!"); } // UnityEngine.Debug.Log("AWIOHandler--call OnDataProtoBufRead --" + DefaultObjectDumpFormatter.HexDump(data)); UnityEngine.Debug.Log("反序列化消息名字长度: " + msgNameLen); UnityEngine.Debug.Log("反序列化消息参数据度: " + data.Bytes.Length); UnityEngine.Debug.Log("反序列化消息内容: " + DefaultObjectDumpFormatter.HexDump(data)); ProtoBuf.IExtensible message = this.protoBufserializer.Deserialize(msgNameLen, data.Bytes, 0, data.Bytes.Length); UnityEngine.Debug.Log("反序列化消息: " + message.GetType().FullName.ToString(null) + " OK!"); HandleProtoBufPacketData(message); }
public static void Dispatch(ProtoBuf.IExtensible msg) { Type key = msg.GetType(); if (s_Handlers.ContainsKey(key)) { // We found a specific handler! :) s_Handlers[key].Process(msg); } else { // We will have to resort to the default handler. :( s_DefaultHandler.Process(msg); } }
public override void SerializeTo(Stream stream, ProtoBuf.IExtensible message) { var messageType = this[message.GetType()]; var package = new Pmd.ForwardNullUserPmd_CS() { byCmd = messageType.Cmd, byParam = messageType.Param, time = DateTime.Now.ToUnixTime(), }; using (var buf = new MemoryStream()) { ProtoBuf.Serializer.NonGeneric.SerializeWithLengthPrefix(buf, message, ProtoBuf.PrefixStyle.Base128, 0); package.data = buf.ToArray(); } ProtoBuf.Serializer.NonGeneric.SerializeWithLengthPrefix(stream, package, ProtoBuf.PrefixStyle.Base128, 0); }
static public TableType InitTable(ProtoBuf.IExtensible table) { TableType dictTable = new TableType(); Type t = table.GetType(); System.Reflection.PropertyInfo p = t.GetProperty("list"); IList ol = (IList)p.GetValue(table, null); foreach (ProtoBuf.IExtensible obj in ol) { Type objType = obj.GetType(); System.Reflection.PropertyInfo objProperty = objType.GetProperty("ID"); object key = objProperty.GetValue(obj, null); object nkey = changeKey(key); dictTable[nkey] = obj; } return(dictTable); }
public static void MessagePump(ProtoBuf.IExtensible message) { var messageType = message.GetType(); if (!methodList.ContainsKey(messageType)) { var namePath = messageType.Name.Split('.'); var methodName = "RPC_" + namePath[namePath.Length - 1]; var method = ProcessorClassType .GetMethod(methodName , System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic ); Delegate mehthodDelegate = Delegate.CreateDelegate(typeof(ProtocolWrapper.MessageHandle <>).MakeGenericType(messageType), method); methodList[messageType] = mehthodDelegate; } var methodDelegate = methodList[messageType]; methodDelegate.DynamicInvoke(message); }
public Pmd.ForwardNullUserPmd_CS Serialize(ProtoBuf.IExtensible message) { if (message == null) { return(null); } var type = this[message.GetType()]; if (type == NetMessageType.Empty) { return(null); } var package = new Pmd.ForwardNullUserPmd_CS() { byCmd = type.Cmd, byParam = type.Param, time = DateTime.Now.ToUnixTime(), }; var msg = message as ProtoBuf.IMessage; package.data = msg.SerializeToBytes(); return(package); }
public bool TryApplyMessage(ProtoBuf.IExtensible message, DemoParser parser) { CSVCMsg_UserMessage userMessage = message as CSVCMsg_UserMessage; if (userMessage == null || !Enum.IsDefined(typeof(ECstrike15UserMessages), userMessage.msg_type)) { return(false); } ECstrike15UserMessages msg = (ECstrike15UserMessages)userMessage.msg_type; Type toParse = Assembly.GetExecutingAssembly().GetType("DemoInfo.Messages.CCSUsrMsg_" + msg.ToString().Substring(6)); using (var memstream = new MemoryStream(userMessage.msg_data)) { ProtoBuf.IExtensible data = memstream.ReadProtobufMessage(toParse); if (data != null) { switch (data.GetType().Name) { case "CCSUsrMsg_SayText": { SayTextEventArgs e = new SayTextEventArgs(); CCSUsrMsg_SayText sayMsg = (CCSUsrMsg_SayText)data; e.Text = sayMsg.text; e.TextAllChat = sayMsg.textallchat; e.Chat = sayMsg.chat; parser.RaiseSayText(e); break; } case "CCSUsrMsg_SayText2": { SayText2EventArgs e = new SayText2EventArgs(); CCSUsrMsg_SayText2 sayMsg = (CCSUsrMsg_SayText2)data; e.TextAllChat = sayMsg.textallchat; e.Chat = sayMsg.chat; // get the player who wrote the message foreach (KeyValuePair <int, Player> keyValuePair in parser.Players) { if (keyValuePair.Value.Name == sayMsg.@params[0]) { e.Sender = parser.Players[keyValuePair.Key]; break; } } // @params is a 4 length array but only 2 are used [0] = nickname [1] = message text e.Text = sayMsg.@params[0] + " : " + sayMsg.@params[1]; parser.RaiseSayText2(e); break; } case "CCSUsrMsg_ServerRankUpdate": { ServerRankUpdateEventArgs e = new ServerRankUpdateEventArgs { RankStructList = new List <ServerRankUpdateEventArgs.RankStruct>() }; CCSUsrMsg_ServerRankUpdate rankMsg = (CCSUsrMsg_ServerRankUpdate)data; foreach (CCSUsrMsg_ServerRankUpdate.RankUpdate rankUpdate in (rankMsg.rank_update)) { ServerRankUpdateEventArgs.RankStruct rankStruct = new ServerRankUpdateEventArgs.RankStruct { New = rankUpdate.rank_new, Old = rankUpdate.rank_old, NumWins = rankUpdate.num_wins, RankChange = rankUpdate.rank_change, SteamId = rankUpdate.account_id + VALVE_MAGIC_NUMBER }; e.RankStructList.Add(rankStruct); } parser.RaiseServerRankUpdate(e); break; } default: // TODO: maybe, like, implement something here one day? //Problem: There is no real useful info here if I see it correcly. Sorry. //var messageType = (Messages.ECstrike15UserMessages)userMessage.msg_type; return(true); } } return(false); } }
public void Send(ProtoBuf.IExtensible cmd) { if (netLink == null) { return; } try { var package = VarlenProtobufCommandSerializer.Instance().Serialize(cmd); var ok = packageSerializer.Write(package, netLink, bFirstMsg); if (ok) { bFirstMsg = false; if ((cmd is Pmd.ForwardBwNullUserPmd_CS) == false && LogFilter(cmd)) { if (Engine.Utility.Log.MaxLogLevel >= Engine.Utility.LogLevel.LogLevel_Group) { Engine.Utility.Log.LogGroup(GameDefine.LogGroup.Net, "<color=green>[SEND]</color>{0}: {1}\n{2}", VarlenProtobufCommandSerializer.Instance()[cmd.GetType()], cmd.GetType().Name, cmd.Dump()); } } } else { if (Engine.Utility.Log.MaxLogLevel >= Engine.Utility.LogLevel.LogLevel_Group) { Engine.Utility.Log.LogGroup(GameDefine.LogGroup.Net, "<color=red>[SEND ERROR]</color>{0}: {1}\n{2}", VarlenProtobufCommandSerializer.Instance()[cmd.GetType()], cmd.GetType().Name, cmd.Dump()); } } } catch (Exception ex) { packageSerializer.OnError(ex); } }
private void PushCmd(ProtoBuf.IExtensible message) { if (message == null) { return; } //老协议,转换 var raw = message as Pmd.ForwardBwNullUserPmd_CS; if (raw != null) { Execute(raw); return; } var rawNull = message as Pmd.ForwardNullUserPmd_CS; if (rawNull != null) { Execute(rawNull); return; } if (Protocol.Instance.IsReconnecting) { if (Engine.Utility.Log.MaxLogLevel >= Engine.Utility.LogLevel.LogLevel_Group) { Log.LogGroup("ZDY", "重连第一个message name " + message.GetType().Name); } if (message.GetType().Namespace.Equals("GameCmd")) { if (message is GameCmd.stLoginStepSelectUserCmd) { isReConnectByLogin = true; GameCmd.stLoginStepSelectUserCmd cmd = message as GameCmd.stLoginStepSelectUserCmd; if (cmd.step == GameCmd.LoginStep.LOGIN_SCENE) { Log.Error("收到消息是LOGIN_SCENE,走重新登录流程"); isReConnectByLogin = false; Protocol.Instance.SetReconnect(false, true); } } } else {//非登录流程 任意一个消息代表重连成功 if (!isReConnectByLogin) { if (Engine.Utility.Log.MaxLogLevel >= Engine.Utility.LogLevel.LogLevel_Group) { Log.LogGroup("ZDY", "不走重新登录 重连第一个message name " + message.GetType().Name); } Protocol.Instance.SetReconnect(false, false); } } } //receivedQueueProtobuf.Enqueue(message); receivedQueueMessage.Enqueue(message); if (NetService.LogFilter(message)) { if (Engine.Utility.Log.MaxLogLevel >= Engine.Utility.LogLevel.LogLevel_Group) { Engine.Utility.Log.LogGroup(GameDefine.LogGroup.Net, "<color=yellow>[RECV]</color>{0}: {1}\n{2}", VarlenProtobufCommandSerializer.Instance()[message.GetType()], message.GetType().Name, message.Dump()); } // [RECV]的网络接收日志 } }
void DispatchMessage() { ProtoBuf.IExtensible proto = null; //if (receivedQueueProtobuf.TryDequeue(out proto)) //{ // if (dispatcherProtobuf.Dispatch(proto) == false) // { // var tag = VarlenProtobufCommandSerializer.Instance().rawCommandSerializer[proto.GetType()]; // Engine.Utility.Log.Trace("<color=red>[RECV]</color>未处理的消息: {0} {1}\n{2}", tag, proto.GetType(), proto.Dump()); // } //} while (receivedQueueMessage.Count > 0) { proto = receivedQueueMessage.Dequeue(); /* * INetLinkMonitor montitor = NetService.Instance.CurrentMoniter; * if (montitor != null) * { * var dic = montitor.GetMessageData(); * string name = proto.GetType().Name; * if (dic.ContainsKey(name)) * { * uint num = dic[name]; * dic[name] = num + 1; * } * else * { * montitor.SetMontitorMessage(name, 1); * } * } */ if (dispatcherProtobuf.Dispatch(proto) == false) { if (Engine.Utility.Log.MaxLogLevel >= Engine.Utility.LogLevel.LogLevel_Group) { var tag = VarlenProtobufCommandSerializer.Instance().rawCommandSerializer[proto.GetType()]; Engine.Utility.Log.Trace("<color=red>[RECV]</color>未处理的消息: {0} {1}\n{2}", tag, proto.GetType(), proto.Dump()); } } } }
public static void RegisterMessage(int messageid, long threadid, Type handler, ProtoBuf.IExtensible msgInstance) { log.Debug("注册消息处理器 id: " + messageid + " type: " + handler.Name + " msgInstance:" + msgInstance.GetType().Name); MessageHandlers[messageid] = new MessageBean() { MsgId = messageid, ThreadID = threadid, Handler = handler, MsgInstance = msgInstance }; }