IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 基于netty实现简易版的tomcat服务器 -> 正文阅读

[JavaScript知识库]基于netty实现简易版的tomcat服务器

运行效果图:

servlet url配置信息保存在application.properties中,通过解析得到对应的url与方法的映射,并保存到内存中去,基于netty实现访问:代码如下

public void init() throws FileNotFoundException {
String basePath = this.getClass().getResource("/").getPath() ;
FileInputStream ins = new FileInputStream(new File(basePath + “application.properties”)) ;
try {
prop.load(ins);
for (Object obj : prop.keySet()){
String key = trimToEmpty(obj) ;
String property = prop.getProperty(key);
if (key.endsWith(".port")){
if (!(property == “” || property == null)){
this.port = Integer.parseInt(property) ;
}
}
if (key.endsWith(".url")) {
Class clazz = Class.forName(prop.getProperty(key.replaceAll("\.url$",".className"))) ;
Constructor constructor = clazz.getDeclaredConstructor();
if (!constructor.isAccessible()){
constructor.setAccessible(true);
}
urlMapping.put(property,(EasyServlet) constructor.newInstance()) ;
}
}

    if (this.port <= 0){
        this.port = 8080 ;
    }
} catch (Exception e) {
    e.printStackTrace();
}

}
处理器类:

public class EasyTomcatHandler extends ChannelInboundHandlerAdapter {

private Map<String,EasyServlet> urlMapping ;

public EasyTomcatHandler(Map<String, EasyServlet> mapping){
    this.urlMapping = mapping ;
}

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
   if (msg instanceof HttpRequest){
       HttpRequest req = (HttpRequest) msg;

       EasyRequest request = new EasyRequest(ctx,req) ;
       EasyResponse response = new EasyResponse(ctx,req) ;

       String url = request.getUrl();
       if (urlMapping.containsKey(url)){
           EasyServlet servlet = urlMapping.get(url) ;
           servlet.service(request,response);
       }
   }
}

}
当接收到请求的时候队请求进行处理

netty服务端代码:

**

  • @Author: drainli
    **/
    public class EasyApplication {

    private int port ;

    Map<String, EasyServlet> urlMapping = new HashMap<>() ;
    Properties prop = new Properties() ;

    public static void main(String[] args) throws InterruptedException {
    new EasyApplication().startUp();
    }

    public void startUp() throws InterruptedException {

     try {
         init();
     } catch (FileNotFoundException e) {
         e.printStackTrace();
     }
    
     ServerBootstrap bootstrap = new ServerBootstrap() ;
    
     EventLoopGroup boss = new NioEventLoopGroup() ;
     EventLoopGroup works = new NioEventLoopGroup() ;
    
     bootstrap.group(boss,works)
             .channel(NioServerSocketChannel.class)
             .childHandler(new ChannelInitializer<>() {
                 @Override
                 protected void initChannel(Channel ch) throws Exception {
                     ch.pipeline().addLast(new HttpResponseEncoder())
                                     .addLast(new HttpRequestDecoder())
                                     .addLast(new EasyTomcatHandler(urlMapping)) ;
                 }
             })
             .option(ChannelOption.SO_BACKLOG,128)
             .childOption(ChannelOption.SO_KEEPALIVE,true) ;
    
     ChannelFuture sync = bootstrap.bind(port).sync();
    
     System.out.printf("server has startup,the listening port is :%d%n",port);
    
     sync.channel().closeFuture().sync() ;
    
     boss.shutdownGracefully() ;
     works.shutdownGracefully() ;
    

    }

    public void init() throws FileNotFoundException {
    String basePath = this.getClass().getResource("/").getPath() ;
    FileInputStream ins = new FileInputStream(new File(basePath + “application.properties”)) ;
    try {
    prop.load(ins);
    for (Object obj : prop.keySet()){
    String key = trimToEmpty(obj) ;
    String property = prop.getProperty(key);
    if (key.endsWith(".port")){
    if (!(property == “” || property == null)){
    this.port = Integer.parseInt(property) ;
    }
    }
    if (key.endsWith(".url")) {
    Class clazz = Class.forName(prop.getProperty(key.replaceAll("\.url$",".className"))) ;
    Constructor constructor = clazz.getDeclaredConstructor();
    if (!constructor.isAccessible()){
    constructor.setAccessible(true);
    }
    urlMapping.put(property,(EasyServlet) constructor.newInstance()) ;
    }
    }

         if (this.port <= 0){
             this.port = 8080 ;
         }
     } catch (Exception e) {
         e.printStackTrace();
     }
    

    }

    private String trimToEmpty(Object obj){
    return obj == null ? “” : String.valueOf(obj).trim() ;
    }
    }
    访问 firstservlet.do接口时的效果图:

完整代码地址: https://gitee.com/drainli/easy-tomcat

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-13 12:43:13  更:2021-12-13 12:44:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:53:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码