【学习笔记】手写 Tomcat 一

目录

HTTP协议请求格式

HTTP协议响应格式

Socket

解读代码

服务端优化

解读代码

作业

1. 响应一个 HTML 页面给客户端,游览器把接收到的内容进行渲染

2. 文件的媒体类型是写死的,肯定不行,怎么变成动态? 

昨天作业答案

聊天室


HTTP协议请求格式

HTTP协议响应格式

Socket

使用游览器作为客户端

创建一个服务端,当游览器访问时响应 hello

服务端

package com.shao.net;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        // 创建一个ServerSocket对象,监听8080端口,等待客户端连接
        ServerSocket ss = new ServerSocket(8080);

        // 调用accept()方法阻塞等待,直到有客户端连接到服务器,返回一个Socket对象用于与该客户端通信
        Socket socket = ss.accept();

        System.out.println("客户端连接成功");

        // 获取Socket对象的输入流,用于读取客户端发送的数据
        InputStream is = socket.getInputStream();

        // 获取Socket对象的输出流,用于向客户端发送数据
        OutputStream os = socket.getOutputStream();

        // 响应的内容
        String content = "Hello";

        // HTTP 响应的格式
        os.write(("HTTP/1.1 200 OK\r\n").getBytes());
        os.write(("Content-Type: text/html\r\n").getBytes());
        os.write(("Content-Length: " + content.length() + "\r\n").getBytes());
        os.write("\r\n".getBytes());
        os.write(content.getBytes());
        os.flush();
        System.out.println("响应成功");
    }
}

游览器访问服务端

访问本地 IP 加服务端监听的端口

解读代码

因为游览器和服务端是使用 HTTP 协议通信,所以响应的格式是HTTP响应格式

HTTP 请求格式分为三个部分,分别是 请求行、请求头、请求体(数据)

HTTP 响应格式分为三个部分,分别是 响应行、响应头、响应数据

响应行包括 响应协议、状态码、状态码描述

响应头包括 响应数据的类型(媒体类型)、响应数据的长度等

服务端优化

现在的问题,只能访问一次服务端,服务端响应之后就关闭了。这显然不是我们想要的,服务器是当用户访问的时候都会响应数据

那么如何才能让服务端响应数据之后继续运行呢?

解决方案是加个 while 循环

package com.shao.net;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {

        // 创建一个ServerSocket对象,监听8080端口,等待客户端连接
        ServerSocket ss = new ServerSocket(8080);

        while (true) {

            // 调用accept()方法阻塞等待,直到有客户端连接到服务器,返回一个Socket对象用于与该客户端通信
            Socket socket = ss.accept();

            System.out.println("客户端连接成功");

            // 获取Socket对象的输入流,用于读取客户端发送的数据
            InputStream is = socket.getInputStream();

            // 获取Socket对象的输出流,用于向客户端发送数据
            OutputStream os = socket.getOutputStream();

            // 响应的内容
            String content = "Hello";

            // HTTP 响应的格式
            os.write(("HTTP/1.1 200 OK\r\n").getBytes());

            os.write(("Content-Type: text/html\r\n").getBytes());
            os.write(("Content-Length: " + content.length() + "\r\n").getBytes());
            os.write("\r\n".getBytes());

            os.write(content.getBytes());

            os.flush();
            System.out.println("响应成功");

            // 关闭输出流
            os.close();
        }
    }
}

验证

解读代码

1. 为什么不把 ServerSocket ss = new ServerSocket(8080); 这行代码也加到 循环语句呢?

因为这行代码是创建服务端的Socket,只需要创建一次即可

2. 为什么从 Socket socket = ss.accept(); 这行代码开始循环呢?

这行代码是等待客户端连接,建立通信通道。

我们知道,服务端不是只为一个客户端服务的,所以,当新的用户发送连接后,就需要创建一个新的通信通道

作业

1. 响应一个 HTML 页面给客户端,游览器把接收到的内容进行渲染

        创建一个HTML 页面,创建一个方法,使用IO流获取这个HTML 文件的内容,把数据响应给游览器,注意响应的长度  Content-Length 需要和文件的字节数一致

2. 文件的媒体类型是写死的,肯定不行,怎么变成动态? 

方案一:通过判断文件后缀

方案二:通过jdk自带的类去获取文件的媒体类型

方案三:通过第三方插件jar,读取文件判断文件媒体类型

昨天作业答案

聊天室

代码已放到页面


百度网盘

ComfyUI+minimaxh3本地部署:漫剧分镜批量生成工作流全实操 视频生成模型正从云端API向本地化部署迁移,背后的技术逻辑是将扩散模型的文本编码、潜空间采样、VAE解码等阶段拆分为可编排的独立环节。ComfyUI作为节点化管线工具,恰好能以可视化连线方式管理这些阶段,让生成过程可控、可复用、可批量执行。minimaxh3模型支持本地推理,配合LoRA微调与参数优化,能够在保证角色一致性的前提下,从分镜脚本批量产出连续剧情片段,规避云端排队、成本高、素材不可控等工程问题。这套工作流广泛应用于漫剧、短剧和动态条漫的工业化生产,尤其适合需要高频迭代分镜草稿的内容团队。文本以零 阅读详情

相关推荐

设置Solidworks导出文件的坐标系,stl坐标系平移

使用solidworks输出的模型坐标不再原点,怎么平行坐标系,这个方法很简单

weixin_45650767的博客 1万+

手写Tomcat

tomcat提供的服务: 第一:提供Socket服务 第二:进行请求的分发 第三:需要把请求和响应封装成request/response

书生的博客 4098

ADS谐波平衡仿真自动优化报错?三步搞定HB控件设置(附常见错误排查)

本文针对ADS谐波平衡仿真在自动优化中常见的报错问题,提供了三步核心排查法。首先检查并禁用HB控件中可能导致冲突的小信号仿真模式,其次合理化仿真频率与扫描参数设置,最后审视优化变量与目标的定义。通过精准配置HB控件以适配自动优化流程,能有效解决大多数仿真失败问题,确保非线性电路设计顺利进行。

c2d3e4f的博客 789

自己手写tomcat项目

在Servlet(接口中)有:1.init():初始化servlet2.getServletConfig():获取当前servlet的配置信息3.service():服务器(在HttpServlet中实现,目的是为了更好的匹配http的请求方式)4.getServletInfo():获取servlet当前运行过程中的信息5.destroy():销毁,回收内存在I/O中应包含:1.请求头(f12+网络) 2.请求方式(get/post) 3.请求内容。

2302_79585857的博客 1799

ChatIE:基于ChatGPT的零样本信息抽取实战指南

信息抽取是自然语言处理中的核心任务,旨在从非结构化文本中自动识别并结构化关键信息,如实体、关系及事件。传统方法依赖大量标注数据训练专用模型,流程复杂且成本高昂。随着大语言模型的发展,通过提示工程引导模型理解任务,实现了无需训练数据的零样本抽取能力,极大降低了技术门槛与应用成本。这种范式将信息抽取重构为多轮对话问题,通过分阶段提问引导模型逐步输出结构化结果,在快速原型验证、领域适配及小规模数据探索中展现出显著技术价值。本文以ChatIE项目为例,深入解析如何利用ChatGPT API,通过精心设计的提示词与两

weixin_30540691的博客 404

Coze智能体网页集成实战:从零搭建免登录AI助手

本文详细介绍了如何利用Coze Chat SDK从零开始为网站集成免登录AI助手。通过获取访问令牌和智能体ID,仅需几行JavaScript代码即可将功能完整的对话窗口嵌入网页,实现开箱即用的智能交互。文章重点讲解了核心部署步骤、会话隔离方案以及UI深度定制方法,帮助开发者快速打造贴合品牌、提升用户体验的网页AI助手。

gold8的专栏 558

手写Tomcat(一)

Tomcat 服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。Servlet接口文件中定义的方法有以下几个:补充: GenericSrevlet类中实现了init()、getServletConfig()、getServletInfo()、destroy()四个方法,把service()交由HttpSrevlet实现。HttpServlet中关于 service()定义如下: 二、Tomca

m0_74154813的博客 2250

李宏毅机器学习笔记第17周_概述领域自适应(Domain Adaptation)

Domain Adaptation

peaunt1的博客 1104

【学习笔记】手写 Tomcat -- 预备知识

I 是 Input,O 是Output,也就是输入输出流。当我们操作数据时,以内存为基准,把数据读取到内存中是输入,把数据从内存写入到硬盘是输出。

LearnTech_123的博客 1645

老电脑续命神器:Windows 11 26H1 精简游戏版,帧率稳定无压力!(Win11 26H1 极致精简游戏版(3.17G):装完只占 8G 内存,Ultra CPU 性能拉满)

旧电脑福音也能安装windows11畅玩游戏🎮:文章分享一款 Windows 11 26H1 精简游戏版,仅 3.17G、C 盘占用 8G,开机进程约 50 个,内存占用 1.4G,内置游戏优化与运行库,支持离线安装、跳过 TPM 检测,让老电脑也能畅玩 3A 游戏和办公娱乐 🚀。

XiaoqiangClub的博客 1063

可食用野生植物检测实战:基于YOLOv11的智能识别系统全流程指南

本文介绍了一种基于YOLOv11的可食用野生植物智能识别系统。该系统通过深度学习技术,能在0.2秒内精准识别植物是否可食用,准确率高达92%。文章详细阐述了从数据采集、标注到模型训练、验证的全流程,并开发了用户友好的Tkinter交互界面。该系统解决了户外探险和植物研究中植物识别的痛点,具有高精度、实时性和强泛化能力的特点,为户外安全提供了智能化解决方案。

FJN110的博客 164

【学习笔记】手写 Tomcat 六

昨天使用了数据库连接池,我们了解了连接池的优点,那么也可以使用线程池来管理线程,java自带的线程池的参数有 核心线程数,最大线程数,线程活跃时间,时间单位,任务队列,线程工厂,拒绝策略。为了学习了解线程池,我们先手写一个简单的线程池,只需要做到核心线程可重复利用就行。

LearnTech_123的博客 1763

逆向分析-SeparationPreview.aip-分色预览-结构分析(一)-x64dbg条件日志打印-命令表达式-PS脚本

从功能上分析,仅显示使用的专色这个功能,并没有触发插件接口。使用X64dbg加载illustrator进程,切换到句柄窗口,在窗口过程中,右键刷新获取界面。在x64dbg中,在UI中可以输入一些条件表达式,能够计算出对应的值,并打印在日志中。常用的,如果非暂停,输出第一个参数。参数二是utf16的指针,utf16@字符串地址,这里的字符串地址为[[ebp-108]]参数一是utf8的,utf8@字符串地址,这里的字符串地址为[ebp-28]从界面上分析,一个颜色列表,及仅显示专色的多选框组成。

插件开发 644

18_1手写Tomcat学习笔记

tomcat学习笔记 文章目录1 tomcat简介1.1 web服务器1.2 tomcat服务器1.2.1 下载1.2.2 安装1.2.3 配置1.2.4 tomcat目录结构1.2.5 如何去访问一个web应用的某个文件1.2.6 在web服务器中安装web应用1.2.7 配置虚拟目录1.2.8 虚拟主机1.3 浏览器访问web站点原理2 手写tomcat_静态资源3 手写tomcat_动态资源3.1 tomcat工作原理3.2 http get请求格式3.2 http post请...

tangguanlin2008的博客 3741

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

手写简易Tomcat

通过手写tomcat对java中的网络通信有了更进一步的了解

Java新生代 1411

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

从零开始手写Tomcat,一文彻底搞懂Tomcat运行流程(附源码)

一:理论铺垫 tomcat的功能是什么? tomcat是java的一个中间件,浏览器发出HTTP请求后经过tomcat中间件,转发到目的服务器,目的服务器返回响应消息,通过tomcat返回给浏览器。tomcat的使用很简单,但是作为合格的程序员,光会用可不行,接下来就通过手写一个tomcat彻底搞懂tomcat。 在手写Tomcat之前,首先重温一下http和servlet,http协议...

Java鱼仔的博客 7765

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【学习笔记】手写 Tomcat 二

在昨天的基础上,再进一步优化,能够响应HTML文件,图片等静态资源。

LearnTech_123的博客 1485

【学习笔记】手写 Tomcat 五

我们把功能都写在了 Servlet,这样有几个缺点,一是不够低耦合 高内聚,二是不方便协同开发等。我们可以使用三层架构来解决这个问题。三层架构区分层次的目的是为了 “高内聚,低耦合”。

LearnTech_123的博客 1184

手写Tomcat框架

模型核心逻辑并发能力复杂度BIO一请求一线程,全程阻塞低简单NIO线程 + Selector 管多连接中高中等AIO异步通知,线程不等待高复杂2.扫描包的类用的是一个工具类进行实现的2.1首先 进行遍历获取类信息2.2通过反射机制,从目标类(clazz)中提取它上面标注的@WebServlet注解对象2.3这里获取类的无参构造方法 ---创建新的对象并强转向上转型为。

2302_80192044的博客 978

如何用JAVA手写一个Tomcat

Socket(套接字)是计算机网络中用于进程间通信的核心技术,它允许不同主机或同一主机上的不同程序通过网络交换数据Socket 是什么?定义:Socket 是操作系统提供的抽象接口,本质上是通信的端点(Endpoint)。它封装了底层网络协议(如TCP/IP或UDP)的复杂性,提供了一组简单的API【API(Application Programming Interface,应用程序编程接口)是软件系统之间交互的桥梁,定义了如何请求服务、传递数据以及返回结果的规则。】供应用程序使用。关键要素IP地址。

2301_80391652的博客 2580

Tomcat原理之手写

目录 一、准备工作 1.1 Tomcat概要 1.2 技术储备 二、实现步骤 三、相关类的实现和介绍 3.1 包结构 3.2 Servlet配置类 3.3 Tomcat实现类 3.4 请求响应实现类Request/Response 3.5 工具类HttpUtil/FileUtil 3.6 Servlet抽象和测试实现类 四、测试运行 4.1 成功请求servlet(200...

天天向上 1048

手写一个Tomcat服务器

作为java开发者,都知道Tomcat是一个家户喻晓的Web服务器。手写一个Tomcat对我们理解Tomcat的工作原理,还有servlet的执行流程有很大的帮助,下面是我手写一个简要版Tomcat的总结和收获! 首先,先还原Tomcat的本质: 相信大家之前在开发的时候,虽然已经能上手开发web程序,但是对于Servlet的执行流程以及项目还会存在很多疑问,下面是我总结的我之前的疑问也给出相应...

yechengchao的博客 2051

如何基于Netty手写简单的Tomcat?

Spring MVC 处理业务逻辑的,我们感知不到它的存在,平常我们只需要写Controller ,这是因为DispatcherServlet拦截了所有的请求。SpringBoot 提倡零配置,使用注解方式是Spring MVC 的主流。Spring 容器启动时会扫描相关类,并且j解析类上、方法上注解。类上URL作为基础路径和方法上URL拼接作为最终URL ,而对应方法即最终URL的处理器。相关的映射关系也被称为handler mappings。

happycao123的博客 1064
上一篇: 【学习笔记】手写 Tomcat -- 预备知识
下一篇: 【学习笔记】手写 Tomcat 二
LearnTech_123
博客等级 码龄3年 445粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值