tomcat 协议处理程序初始化失败_手写tomcat之实现客户端和服务器的通信

前言:

我们上期从结构方面说了下tomcat的运行机制,这期从代码层面说一下运行过程

首先我们了解一下tomcat是什么?

Tomcat简介:

tomcat是java的一个中间件,浏览器发出HTTP请求后会经过tomcat中间件,转发到目标服务器,目标服务器返回响应消息,通过tomcat返回给浏览器。tomcat的使用很简单,但光会使用不会是一个优秀的程序员,我们需要更深刻的理解tomcat

首先我们要了解一下http请求

http请求

下图就是http请求的部分数据

ace6644eec18ad2f1aea4cee4636289a.png

第一部分:请求行:请求类型,资源路径以及http版本

80893504bad1e95798eb1af8b03c0c7c.png

第二部分:请求头:紧接在请求行之后,用于说明服务器需要使用的附加信息,

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响应协议

e597aff68da7ca1ed9d13a7df01b0833.png

第一部分:状态行,http版本,状态码,状态信息(第一行)

第二部分:响应报文头部,说明服务器需要用到的附加信息(第二行)

第三部分:空行(第三行)

第四部分:响应正文(第四行)

Tomcat实质上就是一个管理servlet的容器,所以我们先要了解servlet的过程

Servlet的运行过程:

实例化Servlet

init方法进行初始化

当收到客户端请求信息时,调用service方法处理客户端请求,service会根据不同的请求类型,调用不同的doXXX()方法

销毁(servlet容器关闭时,实例也随之销毁)

下面我们简单看一下客户端和服务器的通信

客户端和服务器的通信实质就是两个数据的传输,客户端发送inputStream给服务器,服务器回复outputStream给客户端

过程可以简单的由下图所示

ced6ebe25001bfc4bbdfc17e6d8f31d9.png

我们手写代码实现下这个过程

2608806d17951ec131b4fd66138d45ed.png

手动在控制台输入http://localhost:8080/hello,打印结果如下

f64bcbaffaf1c096f860d0d69bc1050d.png

从打印结果可以看到请求的一些信息,控制台显示ok没异常,但此时客户端显示响应无效,

c1170dae47e431312314104a0fa81b03.png

原因就在于客户端只能识别符合HTTP响应协议的数据,我们必须把outputstream的数据让客户端能看懂,其实也很简单,只需要仿照我们上面说的响应信息把返回的数据加上HTTP响应协议的报文头部就行,新建一个response类,如下图所示:

acb3d31e03e184c0667684541b38b8c6.png

再修改测试代码中返回的字符串

4a4be8baeacb129a4787bc3ffafe896b.png

再次启动,此时浏览器显示正常

26a598a2a7abe1e063ebe4a02eba384d.png

这样我们就简单的实现了服务端和客户端之间的通信,此代码只能实现服务器一次只能连接一个客户端。tomcat在解决这个问题时使用了BIO模型,简单来讲就是每个连接一个线程,多线程条件下还有nio模型和APR模式,前面文章有说过这几种模式的区别和调优的思路,有兴趣的点下关注去看我往期文章

结语

篇幅限制,先简单介绍这些,我们下期再细说,小编会定期分享自己学过的知识,各位看官可以点关注,一起分享学习的经验和方法,各位大佬对小编的看法有哪些补充或者不同的观点,欢迎在评论区留言斧正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值