Tomcat原理初探(一)

一、前言

Tomcat是什么?如果是问现在的小孩子,他会一脸问号的看着你。
如果你问80、90后,他会邪魅一笑,汤姆猫嘛,我还是杰瑞呢 =_=。
emmmmm,直接开始正文吧。发现现在自己越来越直接了,没前戏,直接进入正戏。

二、Tomcat是什么

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。------百度百科

对于tomcat是什么,大家可以百度,或者直接进入官网了解,这里就不详细的进行阐述了。

三、简陋的自定义容器

1、tomcat如何运行

首先、tomcat会监听一个接口。我们针对这个接口,所分发的请求,会被监听到。
如何对请求进行监听呢?
答曰:TCP监听,也就是socket监听。其实Http请求的本质,仍然是tcp请求,只是他对tcp请求进行了封装。
当我们的tomcat容器,监听到请求,会对请求进行封装,然后分发给servlet。后面就是我们了解的流程了,不再详述。

2、 show code

废话不多说,show code


/**
 * @author xuyuanpeng
 * @version 1.0
 * @date 2019-06-27 10:27
 */
public class MyTomcat {
    private ServerSocket serverSocket=null;
    private Socket client = null;
    public void start(Integer port) throws IOException {
        serverSocket = new ServerSocket(port);
        System.out.println("MyTomcat 已启动,监听的端口是:" + port);

        while (true){
            client = serverSocket.accept();

            InputStream in = client.getInputStream();
            byte [] buff = new byte[1024];
            StringBuffer sb = new StringBuffer();
            //没有通过while进行读取,多次读取会造成阻塞
            in.read(buff,0,buff.length);
            sb.append(new String(buff));
            XLogUtils.info("接受消息",sb);
            OutputStream out = null;
            try {
                out = client.getOutputStream();
                out.flush();
                out.write("Hello World!".getBytes("utf-8"));
                System.out.println("MyTomcat write end" );

            }catch (Exception e){
                XLogUtils.error(e.getMessage());
            }finally {
                client.close();
                out.close();
                in.close();
            }
        }
    }

    public static void main(String [] args) throws IOException {
        new MyTomcat().start(8081);
    }
}

是不是特别简单?
(1)创建一个ServerSocket 对象,对8081或其他端口进行监听
(2)监听端口请求即代码:serverSocket.accept(); 了解过网络编程的人,应该都知道,此方法时阻塞的。当接收到客户端的请求后,才返回一个Socket继续往下执行。
(3)通过Socket获取其输入流
(4)通过Socket获取其输出流,并对输出流进行write

3、GET运行效果

Tomcat原理初探(一)_第1张图片
服务器日志

MyTomcat 已启动,监听的端口是:8081
GET /getUser HTTP/1.1
Accept: text/html, application/xhtml+xml, image/jxr, */*
Accept-Language: zh-CN
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
Accept-Encoding: gzip, deflate
Host: localhost:8081
Connection: Keep-Alive

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
MyTomcat write end

4、POST运行效果

Tomcat原理初探(一)_第2张图片

POST /getUser HTTP/1.1
Content-Type: application/json
Accept: text/html, application/xhtml+xml, image/jxr, */*
Accept-Language: zh-CN
cache-control: no-cache
Postman-Token: 2238925a-1a65-4dc6-932a-88de48a9fa20
User-Agent: PostmanRuntime/7.6.0
Host: localhost:8081
cookie: __clientId=8539cf9c-7726-4dbd-a34b-885420035edf
accept-encoding: gzip, deflate
content-length: 21
Connection: keep-alive

{
	"userName":"xyp"
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
MyTomcat write end

5、运行结果说明

第一行:
请求类型(post/get) 空格 url参数 空格 http协议版本
第二行
请求体类型
…略
当遇到空行说明请求头完毕,下面是请求体

四、映射到请求方法的思路

我们可以对请求规范进行分析
然后封装成为常规的HttpRequest。上述代码我们可以进行优化
(1)封装URL以及其参数
(2)声明@Service、@Controller接口
(3)对请求的URL进行分析。再通过代理、反射找到被Service注解、Controller注解声明的类,找到其方法。再通过invoke方法,执行找到的方法。并获取返回结果。
(4)将返回的结果,写到OutputStream

五、映射到请求方法的实现

[待续]
嘿嘿嘿…

你可能感兴趣的:(Java,网络编程,tomcat)