Tomcat工作原理(一)一个简单的Web应用

Tomcat解析,从Socket 到 Tomcat (一) Connector Tomcat 是现在主流的Java Web 服务器,接下来的几篇文章将由浅入深介绍Tomcat 的原理以及实现。 Socket: Socket 是Java 提供的一个便捷的服务端通信接口,只要指定 port, host, 就可以实现一个简单的服务器。Tomcat 虽然是一个庞然大物,但它对于请求的监听也是通过Socket 实现的。首先我们先通过一个简单的示例来展示Socket 的使用: public class DateServer { public static void main(Str. 阅读详情

本章主要讲述一个java的web服务是如何工作的。
web也叫HTTP服务,因为他使用HTTP协议与客户端进行交互(通常使用的是浏览器),一个基于java的web服务主要涉及到2个重要的类:java.net.Socket 和java.net.ServerSocket 并通过发送HTTP消息进行通信。

超文本传输协议(HTTP)

HTTP是一种协议,浏览器和web服务之间可以通过他在互联网上接收和发送数据。客户端请求一个文件而服务器端进行响应。HTTP使用的是TCP连接,默认端口80。现在HTTP协议基本上都是1.1版本。

HTTP请求

一个HTTP Request由以下三个部分组成:

  • Method—Uniform Resource Identifier (URI)—Protocol/Version
  • Request headers
  • Entity body

看一个实际的HTTP Request的例子:

//请求方法-URI-协议/版本号
POST /examples/default.jsp HTTP/1.1
//请求头
Accept: text/plain; text/html
Accept-Language: en-gb
Connection: Keep-Alive
Host: localhost
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
//请求体
lastName=Franks&firstName=Michael

HTTP请求的请求方法有很多,GET,POST,HEAD,OPTIONS,PUT,DELETE和TRACE,GET和POST是应用中用的最多的请求方法。
URI-统一资源标识符,用于表示某一个互联网资源。他可以理解为是相对于服务器的根目录,所以以”/”开头
请求头包含客户端环境和请求体的有用信息,比如浏览器信息,请求体的长度设置等

HTTP响应

HTTP Response也包含有三个部分

  • Protocol—Status code—Description
  • Response headers
  • Entity body

看好一个响应的例子:

// 协议/版本-状态码-描述
HTTP/1.1 200 OK
// 响应头
Server: Microsoft-IIS/4.0
Date: Mon, 5 Jan 2004 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 5 Jan 2004 13:13:12 GMT
Content-Length: 112
// 响应体
<html>
<head>
<title>HTTP Response Example</title>
</head>
<body>
Welcome to Brainy Software
</body>
</html>

Socket Class

Socket 是网络连接中的一个端点,通过socket可以使应用读写网络资源。通过此连接,两个不同的软件应用可以通过字节流进行通信。当然,前提是你需要知道对应应用的ip和端口号。在java中,socket是通过java.net.socket类呈现的。
Socket 类的构造方法有很多,例如:

//通过ip和端口
Socket(InetAddress address, int port)
//通过主机名和端口
Socket(String host, int port)
//创建实例
new Socket ("yahoo.com", 80);

其他的就不一一列举了
下面来看一段代码:

public class SocketClass {
    public static void main(String[] args) {
        try {
            //建立连接
            Socket client = new Socket("127.0.0.1",8080);
            //创建流
            OutputStream os  = client.getOutputStream();
            boolean autoFlush  = true;
            PrintWriter ps  =  new PrintWriter(client.getOutputStream(), autoFlush);
            BufferedReader br  = new BufferedReader(new InputStreamReader(client.getInputStream()));
            //向web服务器发送HTTP请求
            ps.println("GET /index.jsp HTTP/1.1");
            ps.println("Host: localhost:8080");
            ps.println("Connection: Close");
            ps.println();
            boolean loop = true;
            StringBuffer sb = new StringBuffer(8096);
            while (loop) {
            if ( br.ready() ) {
                int i=0;while (i!=-1) {
                    i = br.read();
                    sb.append((char) i);
                }
                loop = false;
            }
            Thread.currentThread().sleep(50);
            }
            // display the response to the out console
            System.out.println(sb.toString());
            client.close();

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

这是客户端代码,向服务器发送请求。找根目录下的index.jsp页面。并打印相应信息。

ServerSocket class

上述的Socket class代表的实际上是一个客户端的socket,无论何时,如果你想和服务器取得连接,只需要通过构造方法创建对象即可。
而ServerSocket与Socket不同之处是它必须任何时候都处于等待连接的状态。需要用到的类:java.net.ServerSocket
ServerSocket和Socket不同,它的定位就是等待客户端连接,服务器端socket到一个连接请求,它就会创建一个Socket实例来和客户端的Socket 进行通信
使用构造创建ServerSocket:
常用的构造有

public ServerSocket(int port, int backLog, InetAddress bindingAddress);
这里被绑定的地址必须是 InetAddress 的对象,我们一般可以调用InetAddress.getByName("127.0.0.1"); 来获取他的对象。
如:
new ServerSocket(8080, 1, InetAddress.getByName("127.0.0.1"));

应用代码

我们编写三个类来作为一个简单的服务器应用

  • HttpServer
  • Request
  • Response

The HttpServer Class:

public class HttpServer {

  /** WEB_ROOT 是放html和file文件的地方
   *  这个应用中,WEB_ROOT 就是项目目录下的webroot文件夹
   */
   //获取项目路径下的webroot目录
  public static final String WEB_ROOT =
    System.getProperty("user.dir") + File.separator  + "webroot";
  // 关闭命令
  private static final String SHUTDOWN_COMMAND = "/SHUTDOWN";
  // 接收关闭命令
  private boolean shutdown = false;
  public static void main(String[] args) {
    HttpServer server = new HttpServer();
    server.await();
  }
  public void await() {
    ServerSocket serverSocket = null;
    int port = 8080;
    try {
      serverSocket =  new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
    }
    catch (IOException e) {
      e.printStackTrace();
      System.exit(1);
    }
    // Loop waiting for a request
    while (!shutdown) {
      Socket socket = null;
      InputStream input = null;
      OutputStream output = null;
      try {
      //等待接收
        socket = serverSocket.accept();
        input = socket.getInputStream();
        output = socket.getOutputStream();
        // 创建Request对象(Request实现代码在下面)
        Request request = new Request(input);
        request.parse();
        // 创建Response对象
        Response response = new Response(output);
        response.setRequest(request);
        response.sendStaticResource();
        // 关闭socket
        socket.close();
        //检测先前的URI是否是关闭命令
        shutdown = request.getUri().equals(SHUTDOWN_COMMAND);
      }
      catch (Exception e) {
        e.printStackTrace();
        continue;
      }
    }
  }
}

The Request class:

public class Request {
  private InputStream input;
  private String uri;
  public Request(InputStream input) {
    this.input = input;
  }
  public void parse() {
    // Read a set of characters from the socket
    StringBuffer request = new StringBuffer(2048);
    int i;
    byte[] buffer = new byte[2048];
    try {
      i = input.read(buffer);
    }
    catch (IOException e) {
      e.printStackTrace();
      i = -1;
    }
    for (int j=0; j<i; j++) {
      request.append((char) buffer[j]);
    }
    System.out.print(request.toString());
    uri = parseUri(request.toString());
  }
  //截取 "请求"内容的两个"空格"之间的uri
  private String parseUri(String requestString) {
    int index1, index2;
    index1 = requestString.indexOf(' ');
    if (index1 != -1) {
      index2 = requestString.indexOf(' ', index1 + 1);
      if (index2 > index1)
        return requestString.substring(index1 + 1, index2);
    }
    return null;
  }
  public String getUri() {
    return uri;
  }

}

The Response class:

public class Response {

  private static final int BUFFER_SIZE = 1024;
  Request request;
  OutputStream output;

  public Response(OutputStream output) {
    this.output = output;
  }

  public void setRequest(Request request) {
    this.request = request;
  }
  //读取request对象的URI中的内容
  public void sendStaticResource() throws IOException {
    byte[] bytes = new byte[BUFFER_SIZE];
    FileInputStream fis = null;
    try {
      File file = new File(HttpServer.WEB_ROOT, request.getUri());
      if (file.exists()) {
        fis = new FileInputStream(file);
        int ch = fis.read(bytes, 0, BUFFER_SIZE);
        while (ch!=-1) {
          output.write(bytes, 0, ch);
          ch = fis.read(bytes, 0, BUFFER_SIZE);
        }
      }
      else {
        // file not found
        String errorMessage = "HTTP/1.1 404 File Not Found\r\n" +
          "Content-Type: text/html\r\n" +
          "Content-Length: 23\r\n" +
          "\r\n" +
          "<h1>File Not Found</h1>";
        output.write(errorMessage.getBytes());
      }
    }
    catch (Exception e) {
      // thrown if cannot instantiate a File object
      System.out.println(e.toString() );
    }
    finally {
      if (fis!=null)
        fis.close();
    }
  }
}

在上述的web的应用中,新建了一个ServerSocket,并且处于接受连接状态,他可以接收来自浏览器的请求:http://127.0.0.1/index.html后, 会在浏览器中显示对应的页面(需要在项目路径的webroot下面放入想显示的index.html页面),当接受http://127.0.0.1/SHUTDOWN 后,会关闭连接。

Tomcat工作原理及Java实现 例如,一个组件可能负责解析请求头,另一个组件可能负责解析请求体,还有一个组件可能负责执行Servlet的service()方法等。当Tomcat接收到请求后,它会根据URL匹配到对应的Servlet,并创建一个ServletRequest对象和ServletResponse对象,然后将这两个对象传递给Servlet的service()方法。Tomcat作为一个Servlet容器,通过接收和解析客户端请求,管理和执行Servlet组件,以及处理请求和生成响应等步骤来实现其功能。一、Tomcat的工作原理。 阅读详情

相关推荐

Servlet引擎:JBoss与Tomcat、Jetty协同工作

Servlet引擎:JBoss与Tomcat、Jetty协同工作

学习Tomcat这一篇就够了

Tomcat 第一章 Tomcat概述 1.1、Tomcat概述 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并

轻松的小希 11万+

从原理到实践:手把手教你如何校准和使用六维力传感器(附常见问题排查)

本文详细解析六维力传感器的工作原理与校准方法,提供从选型到故障排查的完整指南。重点介绍电阻式与电容式技术对比、六步校准法实战以及温度补偿技巧,帮助工程师精准测量空间力场。适用于机器人触觉反馈、航空航天测试等高精度场景。

weixin_29309475的博客 388

Tomcat工作原理详细介绍

大部分企业的 Web 应用都运行在它上面,Tomcat 对于程序员来说算是老朋友了,那么今天带大家走近这位老朋友,看看它是如何处理 Web 请求,以及它内部的体系结构,这对帮助我们理解 Tomcat 的使用大有益处。本文你将会学会如下内容:Web 容器与 TomcatTomcat 连接器Tomcat 容器要说清楚 Tomcat 做的事情先要从早期的 Web 应用说起。图 1:浏览器通过 HTTP 服务器获取静态资源如图 1 所示,最开始用户通过浏览器查看诸如新闻之类的静态资源,此时就需要通过 HTTP 服务

Java搜索工程技术栈 6216

光耦选型避坑指南:如何根据CTR参数精准计算输入输出电阻(附24V工业场景实例)

本文深入解析光耦选型核心,聚焦电流传输比(CTR)参数及其衰减特性,提供从输出需求反向推导输入输出电阻的精准计算方法。文章以24V工业场景为例,结合光电耦合器数据手册,详细阐述了如何根据CTR最小值进行降额设计,并给出包含反接保护、TVS管等在内的完整保护电路方案,旨在构建高可靠、长寿命的信号隔离电路,避免因选型或设计不当导致的系统故障。

nept的博客 1040

中国ETF基金行情数据API接口

上交所:https://tsanghi.com/api/fin/etf/XSHG/daily?token={token}&ticker={ticker} 深交所:https://tsanghi.com/api/fin/etf/XSHE/daily?token={token}&ticker={ticker}

2401_83242712的博客 4034

【Tomcat】Tomcat 运行原理

一文搞懂 Tomcat 运行原理

Gmerrysong 的博客 781

医疗领域BGE-M3模型微调全流程:从数据准备到效果评估

本文详细介绍了医疗领域BGE-M3模型的微调全流程,从数据准备到效果评估。通过医疗数据微调,BGE-M3模型在临床问答、病历检索等场景中表现显著提升,能够准确理解医学术语之间的细微差别。文章还提供了实战练习代码和效果评估指标,帮助开发者快速掌握医疗文本嵌入模型的应用技巧。

weixin_29098367的博客 282

web服务器是如何运行的?tomcat基本原理

通过提供不同类型的阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve)、基于IP做访问控制(remote address filter valve),实现对Tomcat服务器的访问控制、流量控制、日志记录等功能。:这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序。

dopapapa的博客 1314

【ESP32-IDF笔记】20-配置以太网网络(W5500)

基于ESP32IDF和官方的ethernet驱动,配置W5500以太网驱动芯片,实现ESP32的有线网络

别看了,就这些信息 3471

ROSTCM6软件下载及语义网络分析详细操作教程(附网盘链接)

ROSTCM6是武汉大学沈阳教授研发编码的国内目前唯一的以辅助人文社会科学研究的大型免费社会计算平台。该软件可以实现微博分析、聊天分析、全网分析、网站分析、浏览分析、分词、词频统计、英文词频统计、流量分析、聚类分析等一系列文本分析。

m0_64336780的博客 4万+

tomcat的工作原理以及简介

Tomcat简介 Tomcat是一个JSP/Servlet容器。其作为Servlet容器,有三种工作模式:独立的Servlet容器、进程内的Servlet容器和进程外的Servlet容器, 它的结构比较复杂,但是又比较模块化,所以只要我们找到了最核心的模块,对于tomcat的整体架构和工作原理就很好理解了。Connector(连接器)组件负责生成请求对象和响应对象的,Tomcat默认为HttpConnector,负责根据收到的Http请求报文生成Request对象和Response对象,并把这两个对象传递给

clean20zj的博客 2661

【PySide6拓展】初识QChart图表

在 PySide6 中,QtCharts模块提供了一系列强大的类,用于创建和管理图表。QChart是这个模块的核心类,它可以帮助开发者轻松地实现数据的可视化。本篇文章将介绍如何使用 PySide6 的QtCharts模块,并通过一个简单的示例教你如何快速引入QChart。QChart折线图柱状图饼图区域图它能够直观地呈现数据,同时支持交互功能,如缩放、拖拽和工具提示等。通过引入QChart,我们可以轻松实现数据的可视化,提升应用的交互性和用户体验。结合其他QtCharts。

m0_62599305的博客 822

手写一个简单的tomcat(从零到一,简单易懂)

教你从零到一构建一个简易的tomcat,获取请求,解析请求,响应资源,刚接触tomcat,本文章是非常适合的,欢迎小伙伴们学习留言交流哦!!!

比时代快才是快,趁风使柁 1645

[Dify实战] 合同审阅助手:识别风险条款、生成修改建议-带绑定资源

摘要: Dify合同审阅助手通过AI技术提升合同审阅效率,快速识别风险条款并输出结构化修改建议。方案包括合同输入、关键条款识别、风险评级和报告生成流程,重点关注付款、责任限制等核心条款。采用分层风险分级(高/中/低)和"红线清单"机制,确保审阅标准化。实施建议先建立条款库和模板,通过样本测试优化模型,定期更新规则库。该方案可缩短审阅时间50%以上,提高风险识别准确率,最终实现法务经验的可复用沉淀。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 597

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Tomcat的作用(自用)

对Tomcat的疑问……自用

你个无聊小demo的博客 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

《深度解析Tomcat》 第一章 一个简单的Web服务器

《深度解析Tomcat》 第一章 一个简单的Web服务器 本章介绍Java Web服务器是如何运行的。从中可以知道Tomcat是如何工作的。 基于Java的Web服务器会使用java.net.Socket类和java.net.ServerSocket类这两个类...

weixin_30763397的博客 385

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

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

tomcat学习笔记(一) 模拟一个简单的web server

之前看视频的过程中看到一个讲tomcat的视频,从那之后才知道自己对tomcat可以说是一无所知。我所说的一无所知意思是对tomcat的工作原理一无所知,当然使用tomcat部署项目肯定是没问题的。我相信肯定有很多朋友和我一样,虽然每天用tomcat,但是对tomcat基本不了解。因此我决定学一学tomcat,网上纯粹讲tomcat的视频基本上没有,昨晚偶然看到一本书,叫做《how tmocat

Larry_Lee88的专栏 3843

TOMCAT中的SOAP简单应用

SOAP的主页:http://ws.apache.org/soap/SOAP RPC 的工作原理非常类似于WEB的请求/响应方式,两者都以HTTP作为通信协议,不同之处在于WEB客户和WEB服务器之间传输的是HTML数据,而在SOAP RPC模式中,SOAP客户和服务之间传输的是符合SOAP规范的XML数据。本文通过一个简单的SOAP应用来说明SOAP RPC的工作方式。在Eclipse里面创建S

Jim Yang 2866

1分钟在Windows上部署一个Tomcat Web 服务器

目录 一、概念 二、原理 三、两大组件 四、HTTP请求过程 五:最重要的搭建部分 一、概念 Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选。 二、原理 Tomcat结构图: Tomcat主要组件:服务器Server,服务Service,连接器Connector、容器Container。连接器Connector和容器Conta...

579

第一章 Web应用程序开发基础

一、HTTP协议工作机制 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它是一种主流B/S架构中应用的通信协议。具有以下特点:1、无状态  服务端不会记录客户端每次提交的请求,服务器一旦相应客户端之后,就会结束本次的通信过程。客户端下一次的请求是一个新的 连接,和上一次通信没有任何关系。2、简...

weixin_30765475的博客 196

【斗医】【1】Web应用开发20天

从哪里开始呢?还是从前段认识的朋友开始吧。前段在圈里认识了一个朋友,当他聊到他用SSH开发了一套系统时,我思想意识中想到SSH应该是一个通讯协议,他用不可置否的语气说:大叔,你从事这一行业也这么多年了,难道不知道SSH?说来惭愧,从事这行业时间真的不短了,好像没有真的从事过WEB方面的开发,当他说及SSH为Struts、Spring和Hibernate时,我才恍然明白SSH的缩写。事有凑巧,最近在...

weixin_34062469的博客 94

Servlet学习之web服务器Tomcat 详解

Web服务器是什么 Web服务器是指驻留于因特网上某种类型计算机的程序。当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处理该请求并将文件发送到该浏览器上,附带的信息会告诉浏览器如何查看该文件(即文件类型)。服务器使用HTTP(超文本传输协议)进行信息交流,这就是人们常把它们称为HTTPD服务器的原因。 Web服务器不仅能够存储信息,还能在用户通过Web浏览器提供的信息的基础上...

weixin_30530339的博客 80

Jetty 的工作原理以及与 Tomcat 的比较

Jetty 的基本架构 Jetty 目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是 Handler,所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮你管理这些 Handler。 Jetty 的基本架构 下图是 Jetty 的基本架构图,整个...

行动起来 116
上一篇: 一.spring-core IoC container(3) 基于javaCode的配置方式
下一篇: Tomcat工作原理(二)一个简单的Servlet容器
最伤离别
博客等级 码龄15年 15粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值