3 tomcat原理
3.1 网卡、端口号和IP
1.先明确三个基础概念(类比现实场景)
概念 | 现实类比 | 核心作用 |
网卡(NIC) | 家里的 “网线接口” 或 “无线路由器天线” | 是计算机连接网络的 物理硬件 ,负责收发数据(类似 “门”,数据进出的通道)。 |
IP 地址 | 家里的 “门牌号”(如:XX 小区 X 栋 X 单元 X 号) | 是设备在网络中的 逻辑地址 ,用于标识设备在 “网络地图” 中的位置(类似 “门牌号”)。 |
端口号(Port) | 家里的 “房间号”(如:客厅、卧室、书房) | 是设备中 应用程序的标识 ,用于区分同一设备上不同的网络服务(类似 “房间功能”)。 |
场景举例:你用手机(设备 A)给朋友发微信消息(应用程序:微信)
- 手机的无线网卡(硬件)负责将微信的数据转化为无线信号(Wi-Fi)发送出去,或接收朋友发来的无线信号。
- 关键点:网卡是 “物理层” 设备,只负责传输数据,不关心数据属于哪个应用(微信、抖音等)。
IP 地址:数据的 “导航地址”
- 你的手机有一个 IP 地址(如:192.168.1.100),朋友的手机也有一个 IP 地址(如:192.168.1.101)。
- 当你发送微信消息时,数据会附带源 IP(你的手机 IP)和目标 IP(朋友的手机 IP),类似在信封上写 “寄件人地址” 和 “收件人地址”,确保数据能从你家(你的设备)送到朋友家(朋友的设备)。
- 关键点:IP 地址只能定位到 “设备”,但无法定位到设备中的具体应用(如:微信、浏览器)。
端口号:数据的 “房间门”
- 你的手机上,微信应用程序会占用一个端口号(如:随机分配的 50001),朋友的手机上,微信服务器会占用一个固定端口号(如:微信服务器的端口号 443)。
- 当数据到达朋友的手机时,手机会根据端口号判断:“这个数据是给微信的,应该送到微信的‘房间’里”。
- 关键点:端口号用于区分同一设备上的不同应用,类似同一栋楼里的不同 “房间号”(客厅、卧室等)。
IP 地址:确定数据要到达的 “设备”(如:XX 小区 X 栋 X 单元)。
端口号:确定数据要交给设备中的 “哪个应用程序”(如:X 单元中的 “客厅” 还是 “书房”)。
二者组合:称为套接字(Socket),格式为 IP地址:端口号(如:192.168.1.100:50001),唯一标识网络中一个设备的某个应用程序。
举例:
你访问网站 www.baidu.com 时:
百度服务器的 IP 地址(如:14.215.177.38)定位到百度的服务器设备;
服务器的端口号(如:80 或 443,HTTP/HTTPS 协议默认端口)定位到 “网页服务” 应用程序,返回网页数据给你的浏览器(浏览器可能用随机端口号如 60001 接收数据)。
网卡是硬件,IP 地址是逻辑地址。
一张网卡可以绑定多个 IP 地址(如:服务器网卡可配置多个 IP),但一个 IP 地址通常对应一张网卡(设备)。
类比:一个房子(网卡)可以有多个门牌号(IP 地址),但一个门牌号(IP)只能对应一个房子(网卡)。
知名端口(0-1023):固定分配给常用服务,如:
80:HTTP 网页服务
443:HTTPS 加密网页服务
21:FTP 文件传输服务
动态端口(1024-65535):由操作系统动态分配给应用程序,如:你打开微信时,系统会随机分配一个端口号(如 50001)。
因为一台设备可能同时运行多个应用(如:微信、浏览器、QQ),IP 地址只能定位到设备,无法区分具体应用。
类比:你家的门牌号(IP)只能找到你家,但快递员要把包裹交给 “爸爸”(微信)还是 “妈妈”(QQ),需要看 “房间号”(端口号)。
- 物理层(网卡):负责数据的物理传输(搬快递的 “运输车”)。
- 网络层(IP 地址):负责规划数据传输的路径(快递的 “地址导航”)。
- 传输层(端口号):负责将数据交付给正确的应用程序(快递的 “签收人”)。
通过这三层协作,网络中的数据才能准确、高效地从一个应用程序(如你的微信)传输到另一个应用程序(朋友的微信)。作为初学者,先记住 “IP 找设备,端口找应用,网卡负责搬数据” 这个核心逻辑即可,后续再深入学习网络协议(如 TCP/IP)会更容易理解!
3.2 tomcat原理
网卡是计算机连接网络的硬件设备,就像计算机与网络之间的 “桥梁” 。在网卡上,需要注册端口号,比如常见的 8080 端口常被 Tomcat 使用,3306 端口常被 MySQL 数据库使用等。端口号的作用是在同一设备上区分不同的网络应用程序,它和 IP 地址组合起来能唯一标识网络中的一个应用程序,就如同门牌号和房间号能确定具体的房间一样。
Tomcat 软件与网卡之间通过 Socket 进行绑定连接 。Socket 是网络上运行的程序之间双向通信链路的终结点,是应用程序与操作系统网络功能交互的桥梁。在这个过程中,采用 BIO(阻塞型 IO)方式 ,也就是阻塞监听。以服务器端为例,当使用ServerSocket创建监听套接字并调用accept()方法时,就进入阻塞监听状态。如果没有监听到客户端的数据连接请求,程序就会一直卡在accept()方法这里,处于等待状态,直到有客户端连接过来,才会继续往下执行,获取与客户端通信的Socket对象 ,然后进行后续的数据交互操作。
浏览器要与服务器进行通信,也得依靠网卡。浏览器把数据发送到本地网卡,然后通过计算机网络,数据到达服务器的网卡 。这个过程中,Socket 在其中起到保证通讯的作用。无论是浏览器与本地网卡,还是服务器网卡与 Tomcat 之间,都是通过 Socket 进行数据传输。即使浏览器和服务器不在同一台本地设备上,其通信原理也是一样的。当服务器网卡接收到数据后,Tomcat 会对数据进行 HTTP 信息解析 ,从中解析出 URL、端口、Cookie、method 等信息 。比如解析出的 URL 可以确定用户请求的是哪个资源,method 可以知道请求的类型(是 GET 请求还是 POST 请求等 )。
Tomcat 中运行的外部项目本质上就是一些文件夹 。这些文件夹里包含了多个 Servlet 文件,比如Aservlet.java、Bservlet.java等 。Servlet 是 Java 中用于处理 Web 请求和生成响应的组件,它们应继承 Servlet 接口,常见的如HttpServlet就继承了 Servlet 接口 。在 Tomcat 启动之前,会做一件重要的事情,就是设置 Servlet 路由。这个路由本质上是一个 HashMap ,它以键值对的形式存储数据。其中,键(K 值)为配置的 URL 地址,值(Value 值)为对应的 Servlet 对象 。当 Tomcat 启动时,会将项目中这些 Servlet 文件相关的信息加载进这个 HashMap 中 。例如,假设有一个Aservlet,它对应的访问 URL 是/项目名称/Aservlet ,那么在 HashMap 中就会有一条记录,键为/项目名称/Aservlet ,值为Aservlet这个对象。
当浏览器发送一个请求到 Tomcat 服务器时,Tomcat 首先解析出请求中的 URL 和 method 等信息 。重点关注解析出的 URL,通过这个 URL,Tomcat 会在之前设置好的 Servlet 路由(即那个 HashMap )中进行匹配。比如用户请求的 URL 是/项目名称/Aservlet ,Tomcat 就会拿着这个 URL 在 HashMap 中查找,找到键为/项目名称/Aservlet的记录,然后根据对应的值找到Aservlet对象,进而调用这个 Servlet 的相关方法来处理请求,比如doGet()或者doPost()方法 ,完成对用户请求的响应处理。
在实际开发中,我们可以自己创建 Servlet。比如新建一个类,让它继承HttpServlet 。为了能让 Tomcat 识别这个 Servlet 的访问地址,我们需要使用@WebServlet注解 。在这个注解中写上对应的访问路径,比如@WebServlet("/aaaServlet") ,这里写的/aaaServlet就是这个 Servlet 的访问地址 ,它是整个 URL 拼图中的一部分。当项目启动后,Tomcat 会根据这个注解配置的地址,在 Servlet 路由的 HashMap 中进行相应的存储和管理 ,当有符合这个 URL 的请求到来时,就能准确找到对应的 Servlet 进行处理。 这样,从网络通信基础,到 Tomcat 与网卡的连接、浏览器和服务器的通信,再到 Tomcat 内部对项目和 Servlet 的管理以及请求处理,就形成了一个完整的 Web 应用处理流程。
3.3 @WebServlet 路由配置
@WebServlet 是一个注解 。注解就像是给代码做的标记 。@WebServlet 这个标记主要用来告诉 Web 服务器(比如 Tomcat )这个 Servlet 类的一些配置信息,最重要的就是它的访问路径 。像 @WebServlet("/myFirstServlet") ,就表示这个 MyFirstServlet 类对应的 Servlet 可以通过 /myFirstServlet 这个路径来访问 。也就是说,当你在浏览器地址栏输入类似 http://localhost:8080/项目名/myFirstServlet (假设项目部署在本地 8080 端口 )这样的地址时,Web 服务器就知道要找这个 MyFirstServlet 来处理请求。
路由简单理解就是一种 “导航” 机制 。在 Web 应用里,当有很多个 Servlet 时(比如有处理用户登录的 Servlet、处理商品展示的 Servlet 等 ),Web 服务器需要知道每个请求该交给哪个 Servlet 去处理。就像你在一个城市里,要去不同的地方需要知道走哪条路,路由就是告诉 Web 服务器 “这个请求该走哪条路,该交给哪个 Servlet” 。
在 Tomcat 里,它用一个类似HashMap(一种数据结构,能存储键值对 )的东西来做路由(如3.2中的图) 。@WebServlet 注解里配置的访问路径就是这个 HashMap 里的 “键” ,对应的 Servlet 类就是 “值” 。当有请求进来时,Web 服务器解析请求的 URL,然后在这个 HashMap 里找匹配的 “键” ,找到后就知道该让哪个 Servlet 去处理这个请求了 。
如果自己手写 Servlet 类,要用 @WebServlet 注解来配置这个 Servlet 的访问路径,这样 Web 服务器就能通过路由机制,准确找到这个 Servlet 来处理相应请求啦。