手写一套迷你版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页面为


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


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

目录
相关文章
|
5月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
277 18
|
5月前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
312 14
|
4月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
4月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
385 0
|
6月前
|
存储 安全 数据安全/隐私保护
HFS-快速创建HTTP服务器
鉴于HFS的操作简便和方便快捷,它在满足快速,临时的文件分享和传输需求上,能够发挥出巨大的作用。只要明确了以上的安全警告,并做好了必需的安全设置,HFS将是一款实用的HTTP服务器工具。
541 9
|
1月前
|
弹性计算 运维 安全
阿里云轻量应用服务器与云服务器ECS啥区别?新手帮助教程
阿里云轻量应用服务器适合个人开发者搭建博客、测试环境等低流量场景,操作简单、成本低;ECS适用于企业级高负载业务,功能强大、灵活可扩展。二者在性能、网络、镜像及运维管理上差异显著,用户应根据实际需求选择。
216 10
|
1月前
|
运维 安全 Ubuntu
阿里云渠道商:服务器操作系统怎么选?
阿里云提供丰富操作系统镜像,涵盖Windows与主流Linux发行版。选型需综合技术兼容性、运维成本、安全稳定等因素。推荐Alibaba Cloud Linux、Ubuntu等用于Web与容器场景,Windows Server支撑.NET应用。建议优先选用LTS版本并进行测试验证,通过标准化镜像管理提升部署效率与一致性。
|
1月前
|
弹性计算 ice
阿里云4核8g服务器多少钱一年?1个月和1小时价格,省钱购买方法分享
阿里云4核8G服务器价格因实例类型而异,经济型e实例约159元/月,计算型c9i约371元/月,按小时计费最低0.45元。实际购买享折扣,1年最高可省至1578元,附主流ECS实例及CPU型号参考。
337 8
|
1月前
|
存储 监控 安全
阿里云渠道商:云服务器价格有什么变动?
阿里云带宽与存储费用呈基础资源降价、增值服务差异化趋势。企业应结合业务特点,通过阶梯计价、智能分层、弹性带宽等策略优化成本,借助云监控与预算预警机制,实现高效、可控的云资源管理。
|
1月前
|
弹性计算 运维 安全
区别及选择指南:阿里云轻量应用服务器与ECS云服务器有什么区别?
阿里云轻量应用服务器适合个人开发者、学生搭建博客、测试环境,易用且性价比高;ECS功能更强大,适合企业级应用如大数据、高流量网站。根据需求选择:轻量入门首选,ECS专业之选。
205 2
下一篇
oss云网关配置