龙空技术网

基于Netty的简易Tomcat版本

依荨 187

前言:

现时兄弟们对“netty对比tomcat”都比较着重,同学们都想要了解一些“netty对比tomcat”的相关文章。那么小编同时在网摘上搜集了一些关于“netty对比tomcat””的相关知识,希望各位老铁们能喜欢,朋友们快快来了解一下吧!

这里实现了一个很简单的Tomcat功能,即监听端口,然后接受请求,根据请求分发请求对应的处理器

基本思路:

基本思路

下面,直接开撸代码

项目是基于idea开发工具

首先新建maven项目

pom.xml引入jar包,这里使用的是netty-all-4.1.50.Final版本

pom.xml

项目结构如下:

项目结构

这里忽略chart包,那是用来做聊天室用的

主要是一个http包,包含NettyRequest和NettyResponse,这两个类的作用类似平时工作中用到的HttpServletRequest和HttpServletResponse

一个servlet包,包含NettyServlet和OneServlet、TwoServlet,本小例子主要处理2个请求,分别用OneServlet、TwoServlet处理,然后NettyServlet是两者的父类,其关系如下:

servlet关系

然后是主类NettyTomcat

资源文件netty-tomcat.properties,主要配置简易tomcat所监听的请求url和对应的处理类servlet

下面分别详述这几个文件

资源文件:

资源文件

配置了可以处理2个请求,分别对应2个处理类

启动类-NettyTomcat

1.创建一个主类对象,调用monitor方法:

启动类一

2.构造方法:

构造方法

如上图所示,得到的maps,包含了获取到的请求url,和处理这个请求的类的实例,由于本例两个处理类均继承于NettyServlet类,所以这里maps的value值都是NettyServlet类型。

3.监听方法monitor:

monitor

这里对代码做一点解释:

58-59行:配置服务端主线程和工作线程组

60行:创建启动类

62-63行:方法需要传入配置的2个线程组,设置通道类型为

io.netty.channel.socket.nio.NioServerSocketChannel

64行:根据主线程配置,设置最大线程数

65行:针对子线程配置,保持长连接

66行:传入事件分发Handler

67行:监听localhost,8080端口

68行:异步断开通道

72-73行:出现异常,关闭线程组,释放资源

4.事件分发Handler--NettyTomcatChannelInitial:

事件分发Handler

需要是io.netty.channel.ChannelHandler类型的对象,这里NettyTomcatChannelInitial继承了io.netty.channel.ChannelInitializer,其中io.netty.channel.ChannelInitializer也继承自io.netty.channel.ChannelHandler

io.netty.channel.ChannelInitializer需要指定泛型,这里直接指定为io.netty.channel.socket.SocketChannel,io.netty.channel.socket.SocketChannel为客户端《浏览器》连接到服务端的数据传输通道

下面是三者的关系:

handler关系

80行:设置加密处理类

81行:设置解密处理类

82行:设置事件处理Handler

5.事件处理Handler

事件处理Handler

传输的数据,通过io.netty.handler.codec.http.HttpRequest来接收,io.netty.handler.codec.http.HttpRequest封装了获取url和名称的一些方法。其实像我们平时用的多的HttpServletRequest和HttpServletResponse其实本质也就是InputStream和OutputStream,这里本来可以直接写一个InputStream和OutputStream来接收的,但是为了简化代码,直接用了Netty给我们封装好的对象io.netty.handler.codec.http.HttpRequest来构建一个自定义的NettyRequest和NettyResponse。

当有客户端<即浏览器>发来请求的时候,

90-93行:这里直接根据Netty中的io.netty.handler.codec.http.HttpRequest接收

94-95行:用两个类似平常用的比较多的HttpServletRequest和HttpServletResponse自定义实现,即

NettyRequest和NettyResponse

96-101行:根据初始化的请求路径和处理对象类,对比这里接收到的请求路径,获取到处理对象类的实例,执行其service方法,找不到对应关系则返回404

下面看下这两个自定义的NettyRequest和NettyResponse

NettyRequest

NettyRequest

17-20行:NettyRequest的构造方法,传入通道处理上下文io.netty.channel.ChannelHandlerContext对象和io.netty.handler.codec.http.HttpRequest

23-24行:调用Netty中的io.netty.handler.codec.http.HttpRequest获取请求方法封装为自己的getRequestMehod<获取请求的方法>

26-28行:调用Netty中的io.netty.handler.codec.http.HttpRequest获取请求路径封装为自己的getUrl<获取请求路径的方法>

NettyResponse

NettyResponse

19-21行:构造方法传入io.netty.channel.ChannelHandlerContext,主要用于向通道输出数据

23-41行:write方法,向通道写入数据,即返回至客户端《浏览器》的数据,这里用到Netty的io.netty.handler.codec.http.FullHttpResponse方法封装标准Http协议数据格式,然后通过通道io.netty.channel.ChannelHandlerContext写出数据

处理类父类NettyServlet

NettyServlet

12-21行:实现service方法,方便主类NettyTomcat调用service方法,这里简单处理,如果是get请求,则调用doGet方法,如果是post调用doPost方法

23-25行:两个静态方法的实现,分别在自己的实现层去实现,方便处理自己的逻辑

处理类OneServlet

OneServlet

doGet方法直接调用doPost方法,然后输出一句话到服务端《浏览器》

处理类TwoServlet

TwoServlet

和第一个处理类一样

实现效果

运行主类NettyTomcat,即完成简易版本的Tomcat

直接输入则显示找不到资源,因为代码没有设置的这种没有找到处理类的返回结果是这样子的

404

输入:得到如下结果

oneDeal

输入:得到如下结果

twoDeal

有需要源码的,可以关注我的公众号(微信)--->依荨,那里有源码下载地址和更加详细的教程,和分享的相关Java技术干货

写代码不易,如有错误,请大神指出来,您的教导是我进步的动力,谢谢!

标签: #netty对比tomcat #netty和tomcat共享数据