前言:
现时兄弟们对“netty对比tomcat”都比较着重,同学们都想要了解一些“netty对比tomcat”的相关文章。那么小编同时在网摘上搜集了一些关于“netty对比tomcat””的相关知识,希望各位老铁们能喜欢,朋友们快快来了解一下吧!这里实现了一个很简单的Tomcat功能,即监听端口,然后接受请求,根据请求分发请求对应的处理器
基本思路:
下面,直接开撸代码
项目是基于idea开发工具
首先新建maven项目
pom.xml引入jar包,这里使用的是netty-all-4.1.50.Final版本
项目结构如下:
这里忽略chart包,那是用来做聊天室用的
主要是一个http包,包含NettyRequest和NettyResponse,这两个类的作用类似平时工作中用到的HttpServletRequest和HttpServletResponse
一个servlet包,包含NettyServlet和OneServlet、TwoServlet,本小例子主要处理2个请求,分别用OneServlet、TwoServlet处理,然后NettyServlet是两者的父类,其关系如下:
然后是主类NettyTomcat
资源文件netty-tomcat.properties,主要配置简易tomcat所监听的请求url和对应的处理类servlet
下面分别详述这几个文件
资源文件:
配置了可以处理2个请求,分别对应2个处理类
启动类-NettyTomcat
1.创建一个主类对象,调用monitor方法:
2.构造方法:
如上图所示,得到的maps,包含了获取到的请求url,和处理这个请求的类的实例,由于本例两个处理类均继承于NettyServlet类,所以这里maps的value值都是NettyServlet类型。
3.监听方法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:
需要是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为客户端《浏览器》连接到服务端的数据传输通道
下面是三者的关系:
80行:设置加密处理类
81行:设置解密处理类
82行:设置事件处理Handler
5.事件处理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
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
19-21行:构造方法传入io.netty.channel.ChannelHandlerContext,主要用于向通道输出数据
23-41行:write方法,向通道写入数据,即返回至客户端《浏览器》的数据,这里用到Netty的io.netty.handler.codec.http.FullHttpResponse方法封装标准Http协议数据格式,然后通过通道io.netty.channel.ChannelHandlerContext写出数据
处理类父类NettyServlet
12-21行:实现service方法,方便主类NettyTomcat调用service方法,这里简单处理,如果是get请求,则调用doGet方法,如果是post调用doPost方法
23-25行:两个静态方法的实现,分别在自己的实现层去实现,方便处理自己的逻辑
处理类OneServlet
doGet方法直接调用doPost方法,然后输出一句话到服务端《浏览器》
处理类TwoServlet
和第一个处理类一样
实现效果
运行主类NettyTomcat,即完成简易版本的Tomcat
直接输入则显示找不到资源,因为代码没有设置的这种没有找到处理类的返回结果是这样子的
输入:得到如下结果
输入:得到如下结果
有需要源码的,可以关注我的公众号(微信)--->依荨,那里有源码下载地址和更加详细的教程,和分享的相关Java技术干货
写代码不易,如有错误,请大神指出来,您的教导是我进步的动力,谢谢!