前言:
我们上期从结构方面说了下tomcat的运行机制,这期从代码层面说一下运行过程
首先我们了解一下tomcat是什么?
Tomcat简介:
tomcat是java的一个中间件,浏览器发出HTTP请求后会经过tomcat中间件,转发到目标服务器,目标服务器返回响应消息,通过tomcat返回给浏览器。tomcat的使用很简单,但光会使用不会是一个优秀的程序员,我们需要更深刻的理解tomcat
首先我们要了解一下http请求
http请求
下图就是http请求的部分数据
第一部分:请求行:请求类型,资源路径以及http版本
第二部分:请求头:紧接在请求行之后,用于说明服务器需要使用的附加信息,
Accept:指浏览器或其他客户可以接受的MIME文件格式。Servlet可以根据它判断并返回适当的文件格式。
Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式。
Accept-Langeuage:指出浏览器可以接受的语言种类,如zh-CN,指中文,zh指英文。
connection: 用来告诉服务器是否可以维持固定的HTTP连接。http是无连接的,HTTP/1.1使用Keep-Alive为默认值,这样,当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都建立连接
Host: 对应网址URL中的Web名称和端口号。
Referer:表明产生请求的网页URL。如何从网页/icconcept/index.jsp中点击一个链接到网页/icwork/search,在向服务器发送的GET/icwork/search中的请求中,Referer是http://hostname:8080/icconcept/index.jsp。这个属性可以用来跟踪Web请求是从什么网站来的。
User-Agent:是客户浏览器名称
剩余两部分上图并没有
第三部分:空行(请求头和主体之间必须有换行)
第四部分:主体数据,可以添加任意数据
http响应协议
第一部分:状态行,http版本,状态码,状态信息(第一行)
第二部分:响应报文头部,说明服务器需要用到的附加信息(第二行)
第三部分:空行(第三行)
第四部分:响应正文(第四行)
Tomcat实质上就是一个管理servlet的容器,所以我们先要了解servlet的过程
Servlet的运行过程:
实例化Servlet
init方法进行初始化
当收到客户端请求信息时,调用service方法处理客户端请求,service会根据不同的请求类型,调用不同的doXXX()方法
销毁(servlet容器关闭时,实例也随之销毁)
下面我们简单看一下客户端和服务器的通信
客户端和服务器的通信实质就是两个数据的传输,客户端发送inputStream给服务器,服务器回复outputStream给客户端
过程可以简单的由下图所示
我们手写代码实现下这个过程
手动在控制台输入http://localhost:8080/hello,打印结果如下
从打印结果可以看到请求的一些信息,控制台显示ok没异常,但此时客户端显示响应无效,
原因就在于客户端只能识别符合HTTP响应协议的数据,我们必须把outputstream的数据让客户端能看懂,其实也很简单,只需要仿照我们上面说的响应信息把返回的数据加上HTTP响应协议的报文头部就行,新建一个response类,如下图所示:
再修改测试代码中返回的字符串
再次启动,此时浏览器显示正常
这样我们就简单的实现了服务端和客户端之间的通信,此代码只能实现服务器一次只能连接一个客户端。tomcat在解决这个问题时使用了BIO模型,简单来讲就是每个连接一个线程,多线程条件下还有nio模型和APR模式,前面文章有说过这几种模式的区别和调优的思路,有兴趣的点下关注去看我往期文章
结语
篇幅限制,先简单介绍这些,我们下期再细说,小编会定期分享自己学过的知识,各位看官可以点关注,一起分享学习的经验和方法,各位大佬对小编的看法有哪些补充或者不同的观点,欢迎在评论区留言斧正。