Tomcat是怎么炼成的?(1)兼一点废话

Spring Boot如何启动嵌入式Tomcat?(1) getWebServer会调用ServletContextInitializer#onStartup,即若想在Servlet容器启动时做一些事情,比如注册自己的Servlet,可以实现一个ServletContextInitializer,在Web容器启动时,Spring Boot会把所有实现ServletContextInitializer接口的类收集起来,统一调其onStartup。 阅读详情

     其实想做这事儿的想法大概去年就形成了,最初是想去翻译《How Tomcat works》这本书,大概翻译到一半左右的时候,因为种种原因停止了,这确实是一本很好的书,可惜最终没有能坚持下来,不过上周看到了这本书的中文版已经上市了,浏览了一下,翻译的质量还不错,当然比我的肯定好多了,可惜这究竟这本书成书比较早,而且怎么说呢?总感觉离我这种小菜鸟比较远的感觉,所以才再准备写这一系列教程吧算是。总结来说是想分为两个目的:
1 每次都能写出个可以用的东西,这里代码可能不漂亮,可以不健壮,但一定可以用,在这个基础上,我们再对代码精雕细琢,我们是针对小菜鸟的,我也更欢迎高手来指正;
2 前面提到了这本书成书比较早,所以Tomcat6以及之后的版本就没有涉及,这里也希望可以从Tomcat的演进版本中学习一点,按照我目前的计划来看,这部分估计会以外传(话说我还是挺喜欢看网络小说的)的形式出现。
     其实这个系列教程我已经写了一点,总想多写一点再发上来,不给自己太大的压力,不过之前在优快云上也看到了类似的文章(http://blog.youkuaiyun.com/beijiguangyong/article/details/7439352) ,总觉得不能让自己太放松,我总有太多想做的事情,总得开始吧!。好了,废话说完了~
       再强调一下,我希望能够一次一点的,每次保证一个可以运行的程序为结束,最终能够将简易版的Tomcat写出来。我坚信,前途是光明的,但道路是曲折的。需要你的不多,一台Java环境配置好的电脑,一个eclipse,自认为懂点Java,有个想搞点事儿的心,可以了,开始吧!

一、 看看HTTP协议
       我们要写的Tomcat是一个WEB服务器,那WEB服务器该如何工作?HTTP协议又具体是怎么回事?这里我们举个例子来说:
       在飞机场都会设置一个服务台,当我们告诉服务台的工作人员我们需要乘坐的航班号之后,服务人员就会告诉我们需要在哪个柜台进行办理手续。而对应来说,当我们在浏览器的地址栏输入一个网址之后,点击回车,想去访问这个网站时,这就相当于我们问这个网站的服务器我们要访问这个网站。这时网站服务器会根据我们的网址,找到我们需要的那个页面,返回给我们的浏览器。浏览器就能把这些内容展示到页面上。而我们在机场和服务台的工作人员沟通是用的我们的语言,而浏览器和服务器沟通也有他们的语言,他们的语言比较简单,都是一个固定的格式,称为协议,而为什么叫HTTP协议呢?与HTML语言又有什么关系?这些我们在后面涉及到的时候也会提到,当然如果你现在Google一下就更好了。说了这么多,我们现在就要看看这个HTTP协议是个什么样子?我们来写个最简单的服务器来看看吧!

package com.tomcat;

import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class Main {
	
	public static void main(String[] args) throws UnknownHostException, IOException{
		System.out.println("Server started!");
		// 创建一个ServerSocket对象,监听本机8080端口
		ServerSocket serverSocket = new ServerSocket(8080, 0, InetAddress.getByName("127.0.0.1"));
		while(true){
			// 当有在8080端口访问的时候,调用accept方法得到Socket对象
			Socket socket = serverSocket.accept();
			// 通过Socket获得InputStream流,经过解析得到浏览器发过来的字符串
			InputStream inputStream = socket.getInputStream();
			StringBuilder stringBuilder = new StringBuilder();
			byte[] bytes = new byte[2048];
			int bytesLength = inputStream.read(bytes);
			for(int i =0 ; i<bytesLength; i++){
				stringBuilder.append((char)bytes[i]);
			}
			System.out.println("----the resques string----");
			System.out.print(stringBuilder.toString());
			System.out.println("--------------------------");
		}
	}
}

      我们的服务器是基于Java开发的,因此我们还真算是站在了巨人的肩膀之上,这些在后面的开发中我想会体会的更多。        这里我们主要使用的 Java类包括:ServerSocket类、Socket类以及IO包中的InputStream类。下面我简单解释一下这段程序:
      首先我们使用ServerSocket的构造方法,在本机上监听8080端口,创建一个ServerSocket对象。用于接受所有访问本机8080端口的“信息”。下面用了一个死循环,让这个程序一直运行。
      在这个循环体中,ServerSocket的accpet方法很重要,当有一个程序访问到机器的8080端口时,accept方法会将这个访问信息转化为Socket对象。我们就可以通过这个Socket对象知道访问我们服务器的程序到底是要做什么事情了。
      那如何通过 Socket对象知道呢?这里是通过取得Socket对象的成员变量InputStream对象。熟悉Java IO包的朋友应该对这个类肯定不陌生。后面就是调用InputStream对象的read方法,将程序请求的信息读到一个byte数组中。这里你可能会有一个疑问,为什么这个byte数组是2048这么大?万一请求的信息多了怎么办?那会不会有信息丢失呢?好问题,这个将会在具体解释HTTP协议的时候就好理解。
      好,后面我们还需要把byte数组的信息转换为String,这个对你来说应该是小菜一碟了,最后,我们把这个请求信息输出来吧,到底要看看这个HTTP协议是个什么样子?
     怎么样,这个只有三十几行的代码还不算难懂吧,但不要小看它,可以这么说,几乎所有的网络服务器的原型都和它差不多呢。
      这个程序该怎么测试呢?这个简单,首先将我们刚刚完成的程序运行起来,然后打开你电脑里任意一个浏览器,在地址栏里输入:http://localhost:8080/index.html 点击回车后,接着不需要理浏览器上的内容,我们回过头来看Eclipse里的控制台打出的内容吧: 
GET /index.html HTTP/1.1
Host: localhost:8080
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

       这里根据你使用不同的浏览器,可能上面打出的结果一定的差别,这里我们暂且不作讨论。上面这一系列内容其实就是浏览器向服务器申请访问页面时的请求,这个请求的语法就是HTTP协议,后面我们也还会多次提到这段代码,现在我们先来谈谈第一行。
GET /index.html HTTP/1.1
       第一个单词GET,我想了解网页编程的朋友一定不会陌生,一般来说,数据提交的方式主要就有GET和POST两种方式,这里是告诉我们以GET方式,其中的异同这里不再赘述。

       第二个是一个文件路径,这里我们看一下我们希望访问的路径: http://localhost:8080/index.html ,其实我们就是想访问这个根目录下叫做index.html的文件。这里我们从这句话中就可以知道。

       第三个 HTTP/1.1协议,是告诉我们服务器,传输内容是遵守HTTP/1.1协议的规范,这里关于1.0和1.1协议的异同可以去找Google大神,这里就不再多解释。

       好,通过上面的分析,我们了解到可以根据读取的浏览器请求内容,得到需要访问的文件路径,那我们该如何把这个内容返回给浏览器呢?请关注下一部分内容:一个最简单的Web服务器。


VS Code 搭建 STM32 开发环境:从 Keil 迁移与 AI 编程配置指南 嵌入式开发中,集成开发环境的选择直接影响编码效率与调试体验。传统 IDE 在代码补全、版本控制和插件生态上存在局限,而基于编辑器的工具链方案通过扩展组合实现编译、烧录与调试全流程。其技术价值在于灵活的工具链配置与 AI 辅助编程能力,可应用于 STM32 等 ARM Cortex-M 芯片开发。具体涉及 ARM GCC 编译器、Cortex-Debug 调试扩展、c_cpp_properties.json 智能补全配置以及 tasks.json 编译任务定义。从 Keil 迁移时需注意头文件路径、宏定义和编 阅读详情

相关推荐

【教程】ENVI主成分分析详解

主成分分析(PCA)是一种统计方法,简而言之就是用几种特性去描述事物。每个事物都可以用不同的特性去进行表达,但这些特性一般而言是存在相互的融合和冗余,而用主成分分析方法将这些特性进行转换成不相关的新特性。 在ENVI软件中共提供了三种主成分分析方式分别为:(1)Forward PCA Rotation Existing Statistics(2)Forward PCA Rotation New Statistics and Rotate(3)Inverse PCA Rotati...

YW_remote的博客 1万+

什么是tomcat, tomcat该如何使用?(java)

tomcat是什么? 下载安装 tomcat目录结构 启动服务器 部署静态页面 什么是"静态"? 部署单个HTML页面 部署带有CSS /JavaScript / 图片的 HTML 部署html到单独的目录中 部署到云服务器

随便写点C++和JAVA的知识 1031

Leaflet 加载天地图完整配置指南:从插件修改到无限缩放(附源码)

本文详细介绍了Leaflet与天地图深度集成的完整配置指南,包括插件修改、无限缩放实现及源码示例。通过解析天地图服务的WMTS协议、双投影支持和密钥机制,帮助开发者突破缩放级别限制,优化地图应用性能,适用于Web地图开发和高精度GIS系统。

weixin_27180827的博客 441

Tomcat7转Tomcat9中的一点小坑

前段日子从JDK1.7转为JDK1.8,使用的tomcat也从7变为9。项目迁移中前端出现中文乱码问题。 后经查证,是由于我项目中对于get请求的传参用了new String(room_data.getBytes("ISO-8859-1"), "utf-8");处理编码格式引起的,去掉此处理即可解决。 今日又遇见此类问题,查了下原因是由于tomcat7及以前的默认编码格式是ISO-8859-1...

weixin_34384681的博客 4620

电脑版微信多开,最详细教程没有之一

首先桌面任意的位置右键新建文本文档输入如下代码: TASKKILL /F/IM WECHAT.EXE start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" ...

大超子 4391

anaconda安装-超详细版

文章目录一、anaconda安装1.1 anaconda安装地址1.2 安装详细步骤检验安装是否成功更改conda源(后续安装第三方库可以加快速度) 一、anaconda安装 Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。装anaconda,就不需要单独装python了。 anaconda优点: 1、anaconda里面集成了很多关于python科学计算的第三方库,主要是安装方便,而p

in546的博客 25万+

无废话Apache+Tomcat配置

(Wed Jun 5 16:01:47 2002) , 转信//至少看过两三本书上关于apache和tomcat的配置,都是支支吾吾,不得要领//这篇文章非常实用,照着它的说明不须一个小时,就可以配置和测试好环境//可以说是 无废话Apache+Tomcat配置,强烈推荐!eyzz 日期:2000-12-24 11:00:11网上那帮混蛋整天胡说八道,把你弄得迷迷糊糊,其实这个安装真是很简单,跟我

zaowei21的专栏 935

从0到1做AI漫剧:即梦+豆包+剪映+红果全流程实战

AI视频生成正在重塑内容创作的生产方式,它让原本高门槛的影视制作,变成了一条由文本、画面、剪辑与分发环节协同的流水线。理解其底层原理,在于将大模型的语义理解、图像生成与视频合成能力,与工程化的流程管理相结合,从而实现从创意到成片的自动化输出。这种技术的价值,不仅体现在降低制作成本,更在于让个人创作者能够独立完成高质量短剧,并快速迭代内容。在短剧、短视频、广告营销等场景中,利用即梦生成画面、豆包编写剧本、剪映完成剪辑、红果进行分发的组合,已成为一种被广泛验证的实践路径。本文聚焦AI漫剧制作,从环境准备、分镜设

weixin_34072637的博客 384

毫无废话: 从0开始一点一滴用java开发自己的B/S模式程序---1.1(绝对原创)

毫无废话: 从0开始一点一滴用java开发自己B/S构架严重警告:只要知道一点两点就不要看了开场白:曾经看过一本电子版的书,太多的细节没有记住,只记得书名叫:无废话XML。这个名字叫得颇叫我感动,为什么?只因为现在的计算机图书得废话太多了。今天写下这个标题,也就想写个无废话的东东,目的只是给那些想用JAVA开发b/s构架程序,但是还没看见门的同志们一个看见门的提示,至于能不能入门就

wojiaoliufeng的专栏 2613

手把手教你完成YOLOv11分类识别界面搭建,使用Qt6设计YOLOv11分类识别系统,前台系统+后台管理系统开发实战,全网最详细教程

本项目结合YOLOv11分类识别算法和PySide6框架,开发了一套图形化分类识别系统。系统支持图片、视频和摄像头实时分类检测,并具备完善的用户管理功能,包括登录验证、个人信息修改等模块。最新版本新增了管理员后台管理系统,包含用户管理、权限控制等功能。系统采用MySQL数据库存储用户数据,界面设计采用QtDesigner完成,实现了高效的目标分类与友好的交互体验。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1051

C#winform自定义绘制曲线控件实例

本文实例讲解自定义绘制曲线控件过程。 在实际项目中,需要绘制曲线,系统的提供的绘制曲线的控件有时不能满足自己的需要,需要根据项目需要定制开发曲线控件。 实例目标,实时绘制显示温湿度值曲线。

qq_30725967的博客 1735

m1安装tomcat

m1安装tomcat 第一步:在官网下载apache-tomcat,版本看自己喜好 第二步:将下载好的压缩文件解压,并复制到自己想要安装的文件夹,我这里安装在 /usr/local/apache-tomcat-9.0.48 第三步:配置环境变量 vim ~/.zshrc export APACHE_TOMCAT=/usr/local/apache-tomcat-9.0.48 export PATH=PATH:PATH:PATH:APACHE_TOMCAT/bin 第四步:给sh

qq_42685053的博客 3422

完整功能-《网络安全创新实践》:设计并实现一种基于Npcap的网络嗅探器(直接能运行cpp的MFC代码+实验报告)

《网络安全创新实践》:设计并实现一种基于Npcap的网络嗅探器。(直接能跑的MFC)监听所有数据包,以及监听指定IP地址的数据包;(2)能够显示完整的IP数据包首部信息,例如:版本、首部长度、数据包长度、数据包类型(协议字段)、TTL、源IP地址、目的IP地址等;(3)能够显示完整的TCP报文段信息,例如:源端口、目的端口、序号、确认号、数据部分等;(4)能够自动检测SQL注入攻击等Web攻击行为;(5)能够将监听到的数据包信息保存到文件中,以及从文件中读取并显示数据包信息;(6)具有图形化操作界面。

weixin_46531010的博客 661

Tomcat是怎么炼成的?(3)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34227447的博客 97

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

在 CentOS 7 上,安装tomcat(无废话)

您已经成功在 CentOS 7 上解压文件,并将文件夹重命名为server。如果您在安装或运行过程中遇到任何问题,请随时提问!

qq_41278144的博客 459

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

通过Tomcat / Small Tomcat,如何部署Servlet?(超详细)

以下将会通过七个步骤,以打印“hello”为例,对Servlet进行部署;以下将会通过七个步骤,以打印“hello”为例,对Servlet进行部署;使用工具(这是配套使用的方案!):idea2021或2020,jdk 8,Java Servlet API 3.1.0版本,Tomcat 8.5;

CYK_byte的博客 5513

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

tomcat7配置用户的一点问题

tomcat7配置用户时,与tomcat6不同。 会有一个错误。 1、tomcat不配置conf/tomcat-users.xml或者配置不对时。会发生以下错误: 2、tomcat配置conf/tomcat-users.xml: 解决办法:  Note that for Tomcat 7 onwards, the r

qw765811529的专栏 6731

Mac M1配置Apache Tomcat

一、前言 tomcat是一个非常常用的Web服务器,本文记录在Mac M1上配置本地端的Tomcat(免安装方式),并在IntelliJ IDEA中配置Tomcat。 配置前提: 安装并配置好Java SDK 安装好IDEA 二、配置Tomcat 1. 下载tomcat tomcat下载地址:https://tomcat.apache.org/download-90.cgi 可以直接选择最新版本下载,Mac选择zip或者tar.gz格式,如图: 2. 解压到指定目录 下载完成后,直接解压就行。 解压目

m0_43395703的博客 4511

如何配置Tomcat,以及Tomcat和IIS的配置(1)

如何配置Tomcat,以及Tomcat和IIS的配置(1)1、首先要先下载JDK和Tomcat,我使用的版本是JDK_1_4_2_08和Tomcat5.0.16.下载网址请自己网上搜。下面先安装JDK,然后再安装Tomcat。安装完成以后就要添加环境变量了。右击我的电脑->属性->高级->环境变量,在系统变量中新建或编辑环境变量需要添加的环境变量如下:(1)、JAVA_HOME(JDK运行使用

1469

Tomcat主线程监听SHUTDOWN,如何远程关闭Tomcat?守护线程守护了谁?(1)

二、Tomcat主线程监听SHUTDOWNTomcat中的线程也有两种,主线程是非守护线程,其他单独创建的线程或者线程池创建的工作线程都默认是守护线程。当Tomcat启动时,做完所有初始化和启动工作,主线程会进入一个无限循环监听默认8005端口的状态,直到网络中读取到SHUTDOWN指令,才会退出循环,进而调用Tomcat停止销毁操作。

2401_89225039的博客 975

ubuntu 安装Tomcat时遇到的一点小问题

今天在ubuntu上配置tomcat-6.0.18,过程没什么复杂的,解压缩-environment 就可以了,但在运行startup.sh时提示:touch: 无法 touch “/opt/apache-tomcat-6.0.18/logs/catalina.out”: Permission denied./catalina.sh: 357: cannot create /opt/apache-

EYAS'S BLOG 1148

Tomcat是如何运行的?整体架构又是怎样的?(1)

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!

2401_83915450的博客 742
上一篇: Ajax与中文乱码
下一篇: Tomcat是怎么炼成的?(2)一个最简单的Web服务器
codingforfun
博客等级 码龄15年 2粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值