大家也可以关注我的公众号,文章也会同步更新,当然,公众号还会有一些资源可以分享给大家~

手写迷你版 Tomcat - Minicat

Minicat 的目标

我们可以通过浏览器客户端发送 http 请求, Minicat 可以接收到请求进⾏处理,处理之后的结果可以返回浏览器客户端。

基本方向

  • 提供服务,接收请求(Socket 通信)

  • 请求信息封装成 Request 对象,同样响应信息封装成 Response 对象

  • 客户端请求资源,资源分为静态资源(HTML)和动态资源(Servlet)

  • 资源返回给客户端浏览器

迭代实现

我们实现时候呢,一步一步来,可以制定的小版本计划

  • V1.0 需求:浏览器请求 http://localhost:8080, 返回⼀个固定的字符串到⻚⾯"Hello Minicat."
  • V2.0 需求:封装 Request 和 Response 对象,返回 HTML 静态资源⽂件
  • V3.0 需求:可以请求动态资源(Servlet)
  • V4.0 需求:可以多线程访问
  • V5.0 需求:在已有 Minicat 基础上进⼀步扩展,模拟出 webapps 部署效果,磁盘上放置⼀个 webapps ⽬录,webapps 中可以有多个项⽬,⽐如 demo1,demo2,demo3… 具体的项⽬⽐如 demo1 中有 serlvet(也即为:servlet 是属于具体某⼀个项⽬的 servlet),这样的话在 Minicat 初始化配置加载,以及根据请求 url 查找对应 serlvet 时都需要进⼀步处理。

V1.0 版本

环境搭建

确定好方向,就进行项目搭建开发

新建一个 Maven 项目,并调整在 pom.xml

  <groupId>site.suremotoo</groupId><artifactId>Minicat</artifactId><version>1.0-SNAPSHOT</version><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>11</source><target>11</target><encoding>utf-8</encoding></configuration></plugin></plugins></build>

编写启动类 Bootstrap

public class Bootstrap {/*** 设定启动和监听端口*/private int port = 8080;/*** 启动函数** @throws IOException*/public void start() throws IOException {System.out.println("Minicat starting...");String responseData = "Hello Minicat.";ServerSocket socket = new ServerSocket(port);while (true) {Socket accept = socket.accept();OutputStream outputStream = accept.getOutputStream();String responseText = HttpProtocolUtil.getHttpHeader200(responseData.length()) + responseData;outputStream.write(responseText.getBytes());accept.close();}}/*** 启动入口** @param args*/public static void main(String[] args) throws IOException {Bootstrap bootstrap = new Bootstrap();bootstrap.start();}}

HTTP 协议辅助类 HttpProtocolUtil

public class HttpProtocolUtil {/*** 200 状态码,头信息** @param contentLength 响应信息长度* @return 200 header info*/public static String getHttpHeader200(long contentLength) {return "HTTP/1.1 200 OK \n" + "Content-Type: text/html \n"+ "Content-Length: " + contentLength + " \n" + "\r\n";}/*** 为响应码 404 提供请求头信息(此处也包含了数据内容)** @return 404 header info*/public static String getHttpHeader404() {String str404 = "<h1>404 not found</h1>";return "HTTP/1.1 404 NOT Found \n" + "Content-Type: text/html \n"+ "Content-Length: " + str404.getBytes().length + " \n" + "\r\n" + str404;}}

然后我们访问浏览器:http://localhost:8080,页面显示 Hello Minicat.,就说明成功啦。

这就完成 V1.0 版本了

手写迷你版 Tomcat - Minicat相关推荐

  1. 一.手写迷你版Tomcat-初探minicat

    大家都成年人了,大名鼎鼎的Tomcat不需要我过多介绍,直接上手写的思路和代码. 思路分析 我们要建一个叫minicat的工程,来实现迷你版Tomcat. 名称:minicat minicat要做的事 ...

  2. 手写迷你版HashMap

    最近看了一些面试题,感觉网上好像有挺多公司比较喜欢让面试者手写HashMap,说实话理解JDK HashMap源码还是很需要时间的.打开看了一下HashMap源代码,将近2400行代码,前两位作者乃大 ...

  3. canal 监听不到数据变化_数据的异构实战(二)手写迷你版同步工程

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 上一期讲到了通过canal订阅mysql的binlog日志并且转换为对象,那么这一次我们将 ...

  4. 数据的异构实战(二)手写迷你版同步工程

    上一期讲到了通过canal订阅mysql的binlog日志并且转换为对象,那么这一次我们将订阅来的对象通过RocketMQ发送消息,接收方接受消息之后同时存储到其他类型的数据源当中,完成一个简单的数据 ...

  5. 手写一个基于NIO的迷你版Tomcat

    笔者也建立的自己的公众号啦,平时会分享一些编程知识,欢迎各位大佬支持~ 扫码或微信搜索北风IT之路关注 本文公众号地址:手写一个基于NIO的迷你版Tomcat 在很久之前看到了一篇文章写一个迷你版的T ...

  6. 手写实现迷你版 Tomcat

      Minicat要做的事情:作为⼀个服务器软件提供服务的,也即我们可以通过浏览器客户端发送http请求,Minicat可以接收到请求进行处理,处理之后的结果可以返回浏览器客户端. 整体思路: (1) ...

  7. 手写简易版链表及原理分析

    好多人都觉得为什么要自己写这样的数据结构,变成里面不是有吗?为什么要去写,有这个疑问,其实这个疑问这我的脑海中也存在了很长一段时间,本人是学习java编程的,直接看java的集合框架不行吗?这个时候如 ...

  8. 解鞍卸甲——手写简易版Spring框架(终):使用三级缓存解决循环依赖问题

    什么是三级缓存 按照目前我们实现的 Spring 框架,是可以满足一个基本需求的,但如果你配置了A.B两个Bean对象互相依赖,那么立马会抛出 java.lang.StackOverflowError ...

  9. 手写简单版 Promise

    Promise作为ES6新增的函数,帮助我们解决了回调地狱的难题,让我们的异步代码可以更加清晰简洁,作为一名前端程序员,手写简单版Promise应该是必备的技能.接下来不多说,直接上代码了. clas ...

最新文章

  1. c语言修改elf文件crc32,hash/crc32
  2. 29 个你必须知道的 Linux 命令
  3. java基础—统计一个字符串中各个字符出现的次数
  4. 节日仪式感海报PSD分层模板,快来pick一下!
  5. java 8的内存分代改进_java8的内存结构,这一篇文章就够了
  6. Android开发工具集合
  7. Leetcode 刷题笔记(二十五) ——动态规划篇之背包问题:完全背包
  8. 未知账户(S-1-5-21)无法删除的问题
  9. TensorFlow变量:创建、初始化、保存和加载
  10. vscode配置python调试_vscode配置python环境-运行调试-windows环境
  11. 什么是MIMO(多输入多输出),以及MIMO的分类和测试(一)
  12. 张家界 凤凰 旅游有感
  13. 服务器xfs数据丢失的数据恢复过程_服务器数据恢复方案
  14. 无线网卡芯片类型及与linux-wlan-ng的兼容性
  15. java中jdbc查询有返回值_使用JdbcTemplate查询方法的返回值 | 学步园
  16. 基础画图工具matplotlib
  17. openstack ovs-vswitch收包流程
  18. Java内存区域和GC机制
  19. IAR for MSP430 7_12在线调试不能打断点解决方法
  20. 几种数据规整的方法总结

热门文章

  1. 海龟算法的matlab,MATLAB软件求线性规划数学模型-海龟种群问题答辩PPT.ppt
  2. Stable Diffusion,给大家一点小小的固有印象
  3. 中国DR设备行业市场发展研究报告(2022版)
  4. 成都小程序开发公司:智慧农业共享农场菜园,走地鸡认养小程序APP源码开发的案例介绍
  5. HDU 5130 Signal Interference (2014年广州赛区现场赛D题)
  6. 给Qt生成的exe加图标
  7. SAP调用Webservice Consumer/Proxy Consumer示例
  8. struts2_action获取web资源的两种方式
  9. OpenCV捕获摄像头并进行录像、截图等功能的实现
  10. 异或 Python3