手写一套迷你版HTTP服务器(上)

简介: 手写一套迷你版HTTP服务器(上)

本文主要介绍如何通过netty来手写一套简单版的HTTP服务器,同时将关于netty的许多细小知识点进行了串联,用于巩固和提升对于netty框架的掌握程度。


服务器运行效果


服务器支持对静态文件css,js,html,图片资源的访问。通过网络的形式对这些文件可以进行访问,相应截图如下所示:


网络异常,图片无法展示
|


支持对于js,css,html等文件的访问:


网络异常,图片无法展示
|


网络异常,图片无法展示
|


然后引用相应的pom依赖文件信息:


<dependency>
           <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.47</version>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-all</artifactId>
      <version>4.1.6.Final</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.13</version>
    </dependency>
    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>3.2.6</version>
    </dependency>
复制代码


导入依赖之后,新建一个包itree.demo(包名可以自己随便定义)


定义一个启动类WebApplication.java(有点类似于springboot的那种思路)


package itree.demo;
import com.sise.itree.ITreeApplication;
/**
 * @author idea
 * @data 2019/4/30
 */
public class WebApplication {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException {
        ITreeApplication.start(WebApplication.class);
    }
}
复制代码


在和这个启动类同级别的包底下,建立itree.demo.controller和itree.demo.filter包,主要是用于做测试:


建立一个测试使用的Controller:


package itree.demo.controller;
import com.sise.itree.common.BaseController;
import com.sise.itree.common.annotation.ControllerMapping;
import com.sise.itree.core.handle.response.BaseResponse;
import com.sise.itree.model.ControllerRequest;
/**
 * @author idea
 * @data 2019/4/30
 */
@ControllerMapping(url = "/myController")
public class MyController implements BaseController {
    @Override
    public BaseResponse doGet(ControllerRequest controllerRequest) {
        String username= (String) controllerRequest.getParameter("username");
        System.out.println(username);
        return new BaseResponse(1,username);
    }
    @Override
    public BaseResponse doPost(ControllerRequest controllerRequest) {
        return null;
    }
}
复制代码


这里面的BaseController是我自己在Itree包里面编写的接口,这里面的格式有点类似于javaee的servlet,之前我在编写代码的时候有点参考了servlet的设计。(注解里面的url正是匹配了客户端访问时候所映射的url链接)


编写相应的过滤器:


package itree.demo.filter;
import com.sise.itree.common.BaseFilter;
import com.sise.itree.common.annotation.Filter;
import com.sise.itree.model.ControllerRequest;
/**
 * @author idea
 * @data 2019/4/30
 */
@Filter(order = 1)
public class MyFilter implements BaseFilter {
    @Override
    public void beforeFilter(ControllerRequest controllerRequest) {
        System.out.println("before");
    }
    @Override
    public void afterFilter(ControllerRequest controllerRequest) {
        System.out.println("after");
    }
}
复制代码


通过代码的表面意思,可以很好的理解这里大致的含义。当然,如果过滤器有优先顺序的话,可以通过@Filter注解里面的order属性进行排序。搭建起多个controller和filter之后,整体项目的结构如下所示:


网络异常,图片无法展示
|


基础的java程序写好之后,便是相应的resources文件了:


这里提供了可适配性的配置文件,默认配置文件命名为resources的config/itree-config.properties文件:


暂时可提供的配置有以下几个:


server.port=9090
index.page=html/home.html
not.found.page=html/404.html
复制代码


结合相应的静态文件放入之后,整体的项目结构图如下所示:

网络异常,图片无法展示
|


这个时候可以启动之前编写的WebApplication启动类


启动的时候控制台会打印出相应的信息:


网络异常,图片无法展示
|


启动类会扫描同级目录底下所有带有@Filter注解和@ControllerMapping注解的类,然后加入指定的容器当中。(这里借鉴了Spring里面的ioc容器的思想)


启动之后,进行对于上述controller接口的访问测试,便可以查看到以下信息的内容:


网络异常,图片无法展示
|


同样,我们查看控制台的信息打印:


网络异常,图片无法展示
|


controller接收数据之前,通过了三层的filter进行过滤,而且过滤的顺序也是和我们之前预期所想的那样一直,按照order从小到大的顺序执行(同样我们可以接受post类型的请求)


除了常规的接口类型数据响应之外,还提供有静态文件的访问功能:


网络异常,图片无法展示
|


对于静态文件里面的html也可以通过网络url的形式来访问:


home.html文件内容如下所示:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
this is home
</body>
</html>
复制代码


我们在之前说的properties文件里面提及了相应的初始化页面配置是:


index.page=html/home.html
复制代码


因此,访问的时候默认的http://localhost:9090/就会跳转到该指定页面:


网络异常,图片无法展示
|


假设不配置properties文件的话,则会采用默认的页面跳转,默认的端口号8080

网络异常,图片无法展示
|


默认的404页面为


网络异常,图片无法展示
|


基本的使用步骤大致如上述所示。

目录
相关文章
|
27天前
|
安全 网络协议 网络安全
解析HTTP代理服务器不稳定致使掉线的关键原因
随着数字化发展,网络安全和隐私保护成为核心需求。HTTP代理服务器掉线原因主要包括:1. 网络问题,如本地网络不稳定、路由复杂;2. 服务器质量差、IP资源不稳定;3. 用户配置错误、超时或请求频率异常;4. IP失效或协议不兼容。这些问题会影响连接稳定性。
65 8
|
2月前
|
缓存 负载均衡 监控
HTTP代理服务器在网络安全中的重要性
随着科技和互联网的发展,HTTP代理IP中的代理服务器在企业业务中扮演重要角色。其主要作用包括:保护用户信息、访问控制、缓存内容、负载均衡、日志记录和协议转换,从而在网络管理、性能优化和安全性方面发挥关键作用。
96 2
|
3月前
|
搜索推荐 安全 网络安全
服务器支持HTTPS的时机和条件
【10月更文挑战第23天】服务器支持HTTPS的时机和条件
53 5
|
4月前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
121 1
使用Netty实现文件传输的HTTP服务器和客户端
|
3月前
|
存储 Oracle 关系型数据库
oracle服务器存储过程中调用http
通过配置权限、创建和调用存储过程,您可以在Oracle数据库中使用UTL_HTTP包发起HTTP请求。这使得Oracle存储过程可以与外部HTTP服务进行交互,从而实现更复杂的数据处理和集成。在实际应用中,根据具体需求调整请求类型和错误处理逻辑,以确保系统的稳定性和可靠性。
160 0
|
5月前
|
开发者
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
70 1
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
总结和计划总是让人喜悦或镇痛,一方面以前一段时间没有荒废,能给现在的行动以信心,另一方面看到一年的时间并不能完成很多事情,需要抓紧时间。
630 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
负载均衡: LVS(Layer 4), HAProxy(Layer 4、 7),Nginx(Layer 7) 虚拟化: LXC、KVM、Xen HA:Keepalived、Heartbeat 分布式缓存...
778 0
|
SQL Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
     如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。
793 0
|
Web App开发 前端开发