Tomcatアーキテクチャの分析<2>

ここに画像の説明を挿入

下一步 此时会创建一个过滤器链,这个过滤器链就是我们假如要定义一个Filter
此时需要执行的逻辑

	   //...执行servlet之前[pre]
		filterChain.dofiter()// 在执行这个过滤器链子过程钟 我可能会执行servlet
	  //..执行servlet之后[after]
	 类似于这样,也就是说一个请求,被tomcat接受后 先执行fitler的pre方法   再执行	filterChain.dofiter()  这个方法 ,在这个中间就会执行servlet,然后再会执行after方法 

ここに画像の説明を挿入
したがって、現時点では、サーブレットを実行するための実際のdogetメソッド
ここに画像の説明を挿入
は、彼の入力を確認し、それがこの時点でオブジェクトであること確認することです。
ここに画像の説明を挿入
このメソッドをクリックすると、servlet.serviceになります

ここに画像の説明を挿入
戻るservleに、それは?今ここに呼ばれていません
ので、

所以说真正调用doget的逻辑 并不在在tomcat 而是在Httpservlet,
也就是说tomcat里面实际上调用的是我们的servlet.service,最终会让我们
HttpServlet来负责并且判断调用doget(), 并且执行接下来的逻辑

ここに画像の説明を挿入
後半についてお話ししましょう。前半はリクエストオブジェクトの生成方法です。
リクエストからリクエストオブジェクトへのブラウザに何が起こったのか

说白了 tomcat此时就是接受数据 然后将数据封装成request对象,
呢么tomcat毕竟是一个应用程序,应用程序的数据从哪里来的,肯定是操作系统给的
呢么操作系统的数据又是从哪里来,肯定是另外一台服务器给的
所以此时可以这么想

服务器A---------->服务器B
(浏览器)
服务器A 给服务器B发送数据
数据+ip(服务器B)
我们此时的每一个请求都是安全可靠的,此时的可靠就代表着在发送数据过程中间
数据是不可以丢失的 ,	此时就涉及到tcp协议
================================================>
tcp协议可以保证服务器B 接受的数据是完整的 也就是说不会丢失
协议只是规范,此时需要有人来实现这个协议 操作系统来实现 的 比方说window,linux 
因为tcp 协议只是一个传输协议,[负责数据的传输]具体传输的数据是什么 此时与我不关心 ,所以此时用操作系统来实现比较好 
============================================
也就是数据是应用程序生成的数据然后再来掉用操作系统的接口将数据进行传输
应用程序生成的数据调用操作系统的接口来传输数据
tcp协议肯定是在操作系统这个层面上实现的
===========================>
{
    
    
所以说此时
	应用程序生产数据
	建立一个tcp连接
	基于Tcp连接发送数据
}
建立一个tcp连接  最开始要进行3次握手
但是此时我Java程序需要建立tcp连接 不可能调用到你操作系统的方法底层(tcp-connect)方法,或者说操作系统的核心方法不会让你上层的应用程序来调用
 此时操作系统会创建一个socket接口来 供上层应用程序调用 继而调用底层的核心来建立tcp
 	socket是操作系统提供的接口 而我们的上层的应用程序只能使用这个socket











ここに画像の説明を挿入

当我new 一个Socket的时候 最终会调用本地的这个方法来进行tcp连接
socket是操作系统提供的, 供我们建立tcp连接用
源码就不看了 不好找

tomcatに戻ると、tocmatの場合、他の人から送信されたデータを受け入れてリクエストにカプセル化することが多いため、データをフェッチすることです。tomcatは
どこでデータを受信しますか?
もちろん、それはソケット上にあり、tomcatは何をしますか?次に行うこれは、分析のためにソケットから取得され、Requestにカプセル化されたデータです。

接下来 我们tomcat 要做的事情就是把我从socket拿出来的数据
	进行解析 解析成请求  通过什么方式来解析 我们通常用的http协议
	Http协议是一个应用层面得协议,
	 说白了 我不关注于数据得传输,我只关心数据得格式
==================================================
也就是下一步tomcat 接受到了一个http协议也就是说一个请求得时候,
就要吧数据按照http协议的格式吧这个数据解析出来对吧然后解析成request对象
-------------------->
 tomcat从socket中取数据,此时需要涉及到io模型, Bio nio aio
 tomcat7 可以配置的bio nio
 tomact8 默认的是nio
 

ここに画像の説明を挿入

tomcat里面有个组件 Connector ,
connector 就是一个连接器 
 负责 接收数据以及解析数据,处理的协议格式为HTTP/1.1

ここに画像の説明を挿入

ここに画像の説明を挿入

也就是说如果此时 你在这里配置的 是 HTTP/1.1 这个的话
我就用 org.apache.coyote.http11.Http11Protocol[协议处理器]
 这个协议处理器来处理你的请求,自然讲此时可以自定义协议处理器
也就是说
 我现在要解析数据  呢么你到底是那个类 负责来解析数据   

我们吧这个类点进去 看看他的构造方法 此时就涉及到io模型了

ここに画像の説明を挿入

这个endPoint就和io模型有关 这里的jioEndPoint 就是我们常说的bio
也就是说tomcat此时提供不同的io模型来取处理数据


ここに画像の説明を挿入

也就是说tomcat现在使用 bio的io模型来接受socket的数据,
呢么接下来要做的就是依据http协议来解析数据 对吧 他是如何解析的  

ここに画像の説明を挿入

他里面有一个内部类

ここに画像の説明を挿入

ここに画像の説明を挿入

我们现在这种Bio的这种方式
tomcat每接受一个socket 他会怎么做呢

ここに画像の説明を挿入

如果io模型是bio模型 ,呢么每一个socket连接对应一个线程
然后将这个线程放入线程池中来管理这个线程
 也就是说这个线程中的run方法是执行 解析数据的流程
 

ここに画像の説明を挿入

 他解析的第一步就是此时的请求是一个https请求 ,就需要握手
 第二步就是处理

ここに画像の説明を挿入

 然后点进来  就可以看到如何处理的请求   Http协议   请求行 请求报头 请求体 空白行
 今天只是大致说下请求的流程

おすすめ

転載: blog.csdn.net/weixin_43689953/article/details/109588786