1. http协议

CS架构

建立连接“三次握手” 断开连接 “四次挥手”

三次握手:

client:可以与你建立连接吗?

server:可以的

client: 我也可以了

四次挥手:

client:我要断开

server:可以断开

server:我要断开

client:可以断开

双方都有一个确认 断开的过程 因为连接的建立 双方都有资源打开 都有port号被占用 双方需要将打开的资源关闭掉

请求的格式:



响应的格式:

2. 自定义的web框架



核心:Request Response类

applet

servlet

3. 具体实现

Request Response

package com.msb.mytomcat;

import java.io.IOException;
import java.io.InputStream; /**
* @Auther: jack.chen
* @Date: 2023/10/15 - 10 - 15 - 9:24
* @Description: com.msb.mytomcat
* @version: 1.0
*/
public class Request {
//请求方法 GET POST PUT DELETE ...
private String requestMethod; // 请求的url
private String requestUrl; // 构造方法 将请求的inputStream 转化成Request对象
public Request(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024]; int len = 0;// 每次读取的长度 String str = null;
if ((len=inputStream.read(buffer))>0){
str = new String(buffer, 0, len);
}
// GET / HTTP/1.1
String data = str.split("\r\n")[0];
String[] params = data.split(" ");
this.requestMethod = params[0];
this.requestUrl = params[1];
} public String getRequestMethod() {
return requestMethod;
} public void setRequestMethod(String requestMethod) {
this.requestMethod = requestMethod;
} public String getRequestUrl() {
return requestUrl;
} public void setRequestUrl(String requestUrl) {
this.requestUrl = requestUrl;
} @Override
public String toString() {
return "Request{" +
"requestMethod='" + requestMethod + '\'' +
", requestUrl='" + requestUrl + '\'' +
'}';
}
}
package com.msb.mytomcat;

import java.io.IOException;
import java.io.OutputStream; /**
* @Auther: jack.chen
* @Date: 2023/10/15 - 10 - 15 - 9:24
* @Description: com.msb.mytomcat
* @version: 1.0
*/
public class Response {
private OutputStream outputStream; public Response(OutputStream outputStream) {
this.outputStream = outputStream;
} // 将返回的str 包装成前端能识别的 响应
public void write(String str) throws IOException {
StringBuilder builder = new StringBuilder();
builder.append("HTTP/1.1 200 OK\n")
.append("Content-Type:text/html\n")
.append("\r\n")
.append("<html>")
.append("<body>")
.append("<h1>"+str+"</h1>")
.append("</body>")
.append("</html>");
this.outputStream.write(builder.toString().getBytes());
this.outputStream.flush();
this.outputStream.close(); }
}

maping

package com.msb.mytomcat;

import java.util.HashMap;

/**
* @Auther: jack.chen
* @Date: 2023/10/15 - 10 - 15 - 10:06
* @Description: com.msb.mytomcat
* @version: 1.0
*/
// 请求utl 与 处理类servlet 映射关系
public class Mapping {
public static HashMap<String, String> map = new HashMap<>(); static {
map.put("/mytomcat", "com.msb.mytomcat.Servlet");
} public HashMap<String, String> getMap(){
return map;
}
}

抽象类HttpServlet

package com.msb.mytomcat;

import java.io.IOException;

/**
* @Auther: jack.chen
* @Date: 2023/10/15 - 10 - 15 - 10:10
* @Description: com.msb.mytomcat
* @version: 1.0
* 抽象类
*/
public abstract class HttpServlet {
public static final String METHOD_GET = "GET";
public static final String METHOD_POST = "POST"; public abstract void doGet(Request request, Response response) throws IOException;
public abstract void doPost(Request request, Response response) throws IOException; // 根据请求的方式 调用对应的方法
public void service(Request request, Response response) throws IOException {
if (METHOD_GET.equals(request.getRequestMethod())){
doGet(request, response);
} else if (METHOD_POST.equals(request.getRequestMethod())){
doPost(request, response);
} } }

实现类Servlet

package com.msb.mytomcat;

import java.io.IOException;

/**
* @Auther: jack.chen
* @Date: 2023/10/15 - 10 - 15 - 10:23
* @Description: com.msb.mytomcat
* @version: 1.0
*/
public class Servlet extends HttpServlet{
@Override
public void doGet(Request request, Response response) throws IOException {
response.write("get method !");
} @Override
public void doPost(Request request, Response response) throws IOException {
response.write("post method !"); }
}

服务端:

package com.msb.mytomcat;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket; /**
* @Auther: jack.chen
* @Date: 2023/10/15 - 10 - 15 - 10:26
* @Description: com.msb.mytomcat
* @version: 1.0
* 服务端
*/
public class Server { public static void startServer(int port) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException {
ServerSocket serverSocket = new ServerSocket(port); Socket socket = null; while (true){
socket = serverSocket.accept(); // input output InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream(); Request request = new Request(inputStream);
Response response = new Response(outputStream); String url = request.getRequestUrl();
String clazz = new Mapping().getMap().get(url);// 处理类的包
if(clazz!=null){
Class<Servlet> servletClass = (Class<Servlet>) Class.forName(clazz);
Servlet servlet = servletClass.newInstance();
servlet.service(request, response);
System.out.println("200 ok "+ request.toString());
} } } public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {
startServer(8080);
}
}

4. 启动

java项目实践-webapp-mytomcat-day16的更多相关文章

  1. 一次从0到1的java项目实践清单

    虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...

  2. 一份从0到1的java项目实践清单

    虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...

  3. 【java项目实践】具体解释Ajax工作原理以及实现异步验证username是否存在+源代码下载(java版)

    一年前,从不知道Ajax是什么,伴随着不断的积累,到如今常常使用,逐渐有了深入的认识. 今天,假设想开发一个更加人性化,友好,无刷新,交互性更强的网页,那您的目标一定是Ajax. 介绍 在具体讨论Aj ...

  4. SuperDiamond在JAVA项目中的三种应用方法实践总结

    SuperDiamond在JAVA项目中的三种应用方法实践总结 1.直接读取如下: @Test public static void test_simple(){ PropertiesConfigur ...

  5. webapp项目新建java class、webapp目录树结构

      上一篇中我们介绍了IDEA.maven新建webapp项目的两种方式,分别是:在命令行中用模板创建.直接在IDEA中选择骨架创建. 但都存在一个问题:目录树不完整.有些人会不知道接下来该如何创建j ...

  6. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  7. 【项目实践】手把手带你搞定SSM

    以项目驱动学习,以实践检验真知 前言 现在使用Java后端开发使用的技术栈基本上比较统一:Spring + SpringMVC + Mybatis,即大家常说的SSM.虽然现在流行的做法是使用Spri ...

  8. Hangfire项目实践分享

    Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget jobs) 延迟任务执行(De ...

  9. Hangfire项目实践

    Hangfire项目实践分享 Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget ...

  10. 使用maven来管理您的java项目

    maven是一个项目管理工具,使用maven可以自动管理java项目的整个生命周期,包括编译.构建.测试.发布和报告等.在大型项目开发中,使用maven来管理是必不可少的. 一.安装maven 1.W ...

随机推荐

  1. .Net 8与硬件设备能碰撞出怎么样的火花(使用ImageSharp和Protobuf协议通过HidApi与设备通讯)

    前言 本人最近在社区里说想做稚晖君的那个瀚文键盘来着,结果遇到两个老哥一个老哥送了我电路板,一个送了我焊接好元件的电路板,既然大家这么舍得,那我也就真的投入制作了这把客制化键盘,当然我为了省钱也是特意 ...

  2. 欧奈尔的RPS指标如何使用到股票预测

    前言 1988年,欧奈尔将他的投资理念写成了<笑傲股市How to Make Money in Stocks>.书中总结了选股模式CANSLIM模型,每一个字母都代表一种尚未发动大涨势的潜 ...

  3. 【UniApp】-uni-app-动态计算字体大小(苹果计算器)

    前言 本文主要介绍uni-app中动态计算字体大小的方法 原因呢就是在上一篇文章当中我发现输入的内容已经超过了展示区域 于是我就想到了动态计算字体大小的方法,这样就可以保证输入的内容不会超过展示区域 ...

  4. 从零玩转Java和word模板-从零玩转java和word模板

    title: 从零玩转Java和word模板 date: 2021-12-22 18:38:14.086 updated: 2021-12-22 18:38:14.086 url: https://w ...

  5. javacv图片美颜处理,视频美颜处理

    javacv图片美颜处理,视频美颜处理 国产剧明星演戏自带十级滤镜,是众所周知的秘密: 使用opencv也能实现一定的美颜效果: 一.图片美颜 代码 package top.lingkang.test ...

  6. 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 10.5.作业五 为游戏添加一个积分系统,随机生成增益道具

    斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章将解决作业五提出的问题,使用PlayerState,在原本游戏的基础上引入积分系统,实现击杀敌人得分,拾 ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (49)-- 算法导论6.2 1题

    一.参照图6-2的方法,说明 MAX-HEAPIFY(A,3)在数组 A=(27,17,3,16,13,10,1,5,7,12,4,8,9,0)上的操作过程. 文心一言: 下面是 MAX-HEAPIF ...

  8. 文心一言 VS 讯飞星火 VS chatgpt (33)-- 算法导论5.2 5题

    五.设A[1..n]是由n个不同数构成的数列.如果i<j且A[i]>A[j],则称(i,j)对为A的一个逆序对(inversion).(参看思考题2-4 中更多关于逆序对的例子.)假设A的 ...

  9. 如何使用loki查询日志中大于某一数字的值的日志

    简介 loki是一款轻量级的日志收集中间件,比elk体系占用的内存更小,采用go语言开发,可以利用grafana来查询loki中存储的日志,loki存储日志只对提前预设的标签做索引,所以日志存储空间占 ...

  10. 1024 | 9位开发者分享生涯“最”时刻,文武状元大PK等你来

    本文分享自华为云社区<1024程序员节,和华为云一起做不被定义的开发者>,作者:华为云社区精选 . 1024,祝所有开发者们节日快乐 "代码有注释,程序无bug, 需求不改动,永 ...