测试扩展(四)——Tomcat和socket

一、前言

这篇博客主要做一个总结,记录Tomcat和http请求,通过阅读大佬们的博客,得出以下结论:

  1. servlet是java为了支持动态的交互网页所定制的标准
  2. Tomcat为servlet的运行环境,可以称之为容器,Tomcat是运行在JVM上的应用服务器
  3. server是Tomcat的运行环境(sever.xml)
  4. Tomcat支持两种协议:HTTP和AJP(apache 私有协议,用于tomcat和apache静态服务器通信)

基于以上几点,本篇博客将介绍:Tomcat源码结构、servlet结构、Tomcat核心类图、Tomcat功能结构以及具体功能的作用、socket,以上几点只做整体了解,不进行深入分析

若有错误,敬请斧正

参考博客连接在文章末尾粘贴

二、Tomcat源码结构

Tomcat的主体是Catalina,其他包可以看成工具类,支持Catalina

2.1Tomcat框架层次(或者说Catalina框架层次)

2.2Tomcat抽象结构图

2.3Tomcat核心类图

主要由一堆组件组成,如Server、Service、Connector等,并基于JMX管理这些组件

2.4Server

服务器的意思,代表整个tomcat服务器,一个tomcat只有一个Server

Server是整个Tomcat组件的容器,包含一个或多个Service

 主要配置文件为server.xml,server.xml的结构如下

 

2.5Service

Server中的一个逻辑功能层, 一个Server可以包含多个Service

多个Connector+一个Container构成一个Service,Service就是对外提供服务的组件,有了Service组件Tomcat就可以对外提供服务了

2.6Connector

连接器,是Service的核心组件之一,一个Service可以有多个Connector,主要是连接客户端请求

ProtocolHandler用来处理请求,不同的ProtocolHandler代表不同的连接类型,比如:Http11Protocol使用的是普通Socket来连接的(tomcat9已经删除了这个类,不再采用BIO的方式),Http11NioProtocol使用的是NioSocket来连接的。

Endpoint用来处理底层Socket的网络连接,实现TCP/IP协议

  • Endpoint的抽象实现AbstractEndpoint里面定义的Acceptor和AsyncTimeout两个内部类和一个Handler接口。
  • Acceptor用于监听请求,
  • AsyncTimeout用于检查异步Request的超时,
  • Handler用于处理接收到的Socket,在内部调用Processor进行处理

Processor用于将Endpoint接收到的Socket封装成Request(这个Request和ServletRequest无关),用来实现HTTP协议的,

Adapter充当适配器,将请求适配到Servlet容器,用于将Request转换为ServletRequest交给Container进行具体的处理

2.7Container

四种容器:Engine(引擎), Host(主机), Context(上下文), 和 Wrapper(包装器)

这是一个责任链模式,对象层层传递,最后交由Servlet进行处理:

一个container中会存在一个Engine,有且只有一个;

Engine下会有多个host,表示站点或者虚拟主机,使得一个服务器实例可以承担多个域名的服务

一个host下会有多个Context,表示多个应用;

一个Context下会有多个Wrapper, 

Wrapper:表示一个独立的servlet

2.8 Pipeline和valve

2.9Loader

是被Container用来载入各种所需的Class

2.10Manager

是被Container用来管理Session池

2.11Realm

 是用来处理安全里授权与认证

三、servlet

servlet对象的主要配置文件是web.xml,用来设置servlet参数和servlet-mapping。

粗略

详细

四、Socket

socket是connector操作的对象,其中request和response不是servlet的,还需要进行转化。

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

java中的socket对象【java.net.Socket类,客户端socket】
发送字节流,首先必须调用Socket类的getOutputStream方法来获取一个java.io.OutputStream对象
接受字节流,可以调用 Socket 类的 getInputStream 方法用来返回一个 java.io.InputStream 对象
 
java中的socket对象【java.net.ServerSocket,服务端socket】

 

以上就结束了,本篇博客只是整合了一下Tomcat,servlet、socket,如果想看详细内容,可查看下面的参考链接

 

参考连接:

https://www.jianshu.com/p/d74eef07487f

https://www.jianshu.com/p/e438d2f1e4c2

https://blog.csdn.net/qq_34985719/article/details/78386183

https://wenku.baidu.com/view/ed0b80cdb0717fd5370cdc67.html

https://blog.csdn.net/w1992wishes/article/details/79242797

 https://blog.csdn.net/yuxiangaaaaa/article/details/72867037

https://www.jianshu.com/p/571c474279af

https://www.jianshu.com/p/39a2639604ae

posted @ 2019-02-11 09:19  june13  阅读(845)  评论(0)    收藏  举报