Netty消息分发

socket的路由机制是怎么实现的 - 开源中国社区

www.oschina.net/question/2744623_2238825

类似这种的问题,总有一些新人朋友在问。这篇文章分享一下我所知道的思路。

我所想到的有4种解题方法:

Netty消息分发_第1张图片
协议格式

第一种方式,最简单的方法就是写switch,两组switch嵌套,来分发消息到哪个类的哪个函数处理,具体就不多解释了,显然这不是我们想要的写法。

第二种方式,使用XML配置判断消息去哪个类来处理,到处理的具体类里面还是写switch来判断去哪个函数处理。


Netty消息分发_第2张图片
处理大协议号的XML
Netty消息分发_第3张图片
小协议号switch处理

上图的XML配置是我之前做的项目里用的,去哪个类来处理消息,使用该配置文件,在服务器启动的时候根据XML反射创建处理类对象,然后在某个具体类里面处理消息还是使用的switch来判断。显然这种也不是我们想要的处理方式,能不能更优雅一点,比如整成类型SpringMVC那样的操作方式,在类和函数分别上面加上注解来处理消息的分发呢?答案是可以的。

第三中方式,借助spring自定义注解来实现消息的分发,类似SpringMVC的处理方式。

Netty消息分发_第4张图片
定义大协议号注解

Netty消息分发_第5张图片
定义小协议号注解
Netty消息分发_第6张图片
handler扫描器

实现BeanPostProcessor接口,在Bean初始化后对其进行扫描,找出大小协议号。

Netty消息分发_第7张图片
命令执行器


Netty消息分发_第8张图片
命令执行器管理者

使用就和SpringMVC的方式类似了,在接口和函数上分别添加注解。


Netty消息分发_第9张图片
添加注解


Netty消息分发_第10张图片
实现接口,处理消息

完整代码:

git.oschina.net/Spirit_wolf/chat_netty4

上面使用Spring的方式使用反射可能在内存性能方面的问题。


第四种方式,使用JDK8的method reference新特性,性能上可能比第3种方式好,但是开发效率上没第3种方式方便。

interface Handler{

void handler(ISession session, IByteBuffer data);

}

Map map

map.put(CREATE, this::createRole)


Netty消息分发_第11张图片

你可能感兴趣的:(Netty消息分发)