本文主要是介绍ET框架学习——消息系统之一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
OpcodeTypeComponent组件和MessageDispatherComponent组件都是消息系统的组成部分。这里就来好好捋一捋ET的消息系统。从我目前看到现在来说,这个消息系统包括一系列的事件接口,特性,和消息类型的识别码等等部分,这里先撇开前后端通讯部分的消息。
-
消息系统中的抽象类,接口
public interface IMHandler
{void Handle(Session session, object message);Type GetMessageType();
}
IMHandler接口是一个比较基本的接口,可以看到其内部有一个Hadle方法和一个GetMessageType方法。Handle方法接受Session和object两个类型的参数。这两个方法在MessageDispatherComponent类中都被执行了,具体可以看我的这篇文章。
public abstract class AMHandler<Message> : IMHandler where Message: class
{protected abstract void Run(Session session, Message message);public void Handle(Session session, object msg){Message message = msg as Message;if (message == null){Log.Error($"消息类型转换错误: {msg.GetType().Name} to {typeof(Message).Name}");return;}if (session.IsDisposed){Log.Error($"session disconnect {msg}");return;}this.Run(session, message);}public Type GetMessageType(){return typeof(Message);}
}
AMHandler抽象类内部有一个抽象方法Run和一个Handle方法,Handle方法会在判断消息内部不为空后执行Run方法。Module层和Hotfix层,Handle的调用时机不是尽然相同的,Module层是在Module.Session中调用,Hotfix层是在Hotfix.Session中调用。该类的作用在于将接受服务端消息的方法,包装成类,配合MessageHandlerAttribute特性来做一个区分,便于反射来收集。
public interface IRequest: IMessage
{int RpcId { get; set; }
}public interface IResponse : IMessage
{int Error { get; set; }string Message { get; set; }int RpcId { get; set; }
}
IMessage接口是一个空接口,可以不用理会,两个接口都实现了IMessage接口。单单从接口名字上来看,IRequest接口应该使用与请求消息的,里面一个RpcId的属性。IResponse接口是响应消息的,定义了Error错误码属性,Message消息内容属性,RpcId属性。
public interface IMessageDispatcher
{void Dispatch(Session session, ushort opcode, object message);
}
IMessageDispatcher接口,应该是用于派发消息的接口。里面有一个派发消息的方法Dispatch。
-
消息系统中的特性
public class MessageAttribute: BaseAttribute
{public ushort Opcode { get; }public MessageAttribute(ushort opcode){this.Opcode = opcode;}
}
MessageAttribute特性中有一个Opcode,这是为特性修饰的类分配的消息类型的识别码,在指定特性的时候会直接分配。
public class MessageHandlerAttribute : BaseAttribute
{public AppType Type { get; }public MessageHandlerAttribute(){}public MessageHandlerAttribute(AppType appType){this.Type = appType;}
}
MessageHandlerAttribute特性中有一个AppType类型的Type值,AppType是一个枚举,具体可以自己去看看,这个枚举使用了Flags特性,关于该特性,可以看这篇文章。
这篇关于ET框架学习——消息系统之一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!