ET框架学习——消息系统之一

2024-04-16 21:58
文章标签 系统 学习 框架 消息 et

本文主要是介绍ET框架学习——消息系统之一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       OpcodeTypeComponent组件和MessageDispatherComponent组件都是消息系统的组成部分。这里就来好好捋一捋ET的消息系统。从我目前看到现在来说,这个消息系统包括一系列的事件接口,特性,和消息类型的识别码等等部分,这里先撇开前后端通讯部分的消息。

  • 消息系统中的抽象类,接口

public interface IMHandler
{void Handle(Session session, object message);Type GetMessageType();
}

        IMHandler接口是一个比较基本的接口,可以看到其内部有一个Hadle方法和一个GetMessageType方法。Handle方法接受Sessionobject两个类型的参数。这两个方法在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框架学习——消息系统之一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/910004

相关文章

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬