传说用户发来的请求是在JIoEndpoint的accept函数中接收的,是tomact与外界交互的分界点
传说用户发来的请求是在JIoEndpoint的accept函数中接收的,
这是tomact与外界交互的分界点,所以来研究一下,
》》》》》》》》》》》》》》》JIoEndpoint》》》》》》》》》》》》》》》》》》》 从最顶层的interface开启: ==================JIoEndpoint 怎么被拉起================ public interface ProtocolHandler
---》public abstract class AbstractProtocol<S> implements ProtocolHandler,MBeanRegistration
---》public abstract class AbstractAjpProtocol<S> extends AbstractProtocol<S> {
---》public class AjpProtocol extends AbstractAjpProtocol<Socket> java.org.apache.coyote.ajp.AjpProtocol.AjpProtocol() public AjpProtocol() {
endpoint = new JIoEndpoint();
cHandler = new AjpConnectionHandler(this);
((JIoEndpoint) endpoint).setHandler(cHandler);
setSoLinger(Constants.DEFAULT_CONNECTION_LINGER);
setSoTimeout(Constants.DEFAULT_CONNECTION_TIMEOUT);
setTcpNoDelay(Constants.DEFAULT_TCP_NO_DELAY);
} public class JIoEndpoint extends AbstractEndpoint<Socket>
JIoEndpoint ==================JIoEndpoint 怎么被拉起================ ================JIoEndpoint 处理请求================== endpoint = new JIoEndpoint(); ((JIoEndpoint) endpoint).setHandler(cHandler);
-----》 public void setHandler(Handler handler ) { this.handler = handler; }
------》cHandler = new AjpConnectionHandler(this); this --》AjpProtocol--》AbstractAjpProtocol--》AbstractProtocol
----------》void java.org.apache.coyote.AbstractProtocol.init() throws Exception
---》endpoint.init();
-------》AbstractEndpoint.init()
---》bind();
---》public abstract void bind() throws Exception; ----》JIoEndpoint.bind() serverSocket = serverSocketFactory.createSocket(getPort(), getBacklog()); ???是谁调用的?startInternal()
----->startAcceptorThreads();
---> AbstractEndpoint.startAcceptorThreads()
acceptors[i] = createAcceptor();
t.start(); --->JIoEndpoint
protected AbstractEndpoint.Acceptor createAcceptor() {
return new Acceptor();
}
-----------> java.org.apache.tomcat.util.net.AbstractEndpoint.Acceptor ---->run()
---> JIoEndpoint.processSocket(Socket socket)
--> getExecutor().execute(new SocketProcessor(wrapper)); --->SocketProcessor
---->run()
--> state = handler.process(socket, SocketStatus.OPEN_READ); handler====Http11Protocol 之后又会是谁去处理呢?
结论是 JIoEndpoint在调用 Http11ConnectionHandler 的process方法进行处理。
看网上有人给的,我是没有想通,只是猜的,最后的解释在最后面给出。
Http11Processor {
Http11Protocol() public Http11Protocol() {
endpoint = new JIoEndpoint();
cHandler = new Http11ConnectionHandler(this);
((JIoEndpoint) endpoint).setHandler(cHandler);
setSoLinger(Constants.DEFAULT_CONNECTION_LINGER);
setSoTimeout(Constants.DEFAULT_CONNECTION_TIMEOUT);
setTcpNoDelay(Constants.DEFAULT_TCP_NO_DELAY);
}
----------------》Http11ConnectionHandler
---------------》protected static class Http11ConnectionHandler
extends AbstractConnectionHandler<Socket, Http11Processor> implements Handler {
}
Http11Processor createProcessor()
之后的都是看网上的,待后再看
processor.setAdapter(proto.adapter); adapter---》CoyoteAdapter StandardEngin容器默认管道StandardEnginValve StandardHost ---》StandardHostValue
StandardHostValue则选择相应的Context容器
StandardContext默认情况下配置了StandardContextValve
之后选择一个合适的Wrapper容器。
StandardWrapper容器默认情况下配置了StandardWrapperValve。
是启动过滤器FilterChain,对请求执行过滤操作。2)执行service方法。 补充说明,StandardWrapper容器是对于Servlet的包装,
所有的Request的资源可以分成4种不同的类型,
静态资源请求(HTML,图片,CSS等),JSP请求,Servlet请求,以及CGI请求。
对于不同的请求Tomcat用WebdavServlet处理静态资源文件,JspServlet处理Jsp请求,CGIServlet处理CGI请求。
================JIoEndpoint 处理请求================== =======解释========
猜 因为用的http协议是1.1,所以最后用到的是Http11Protocol public interface Handler extends AbstractEndpoint.Handler
的实现类有如下 java.org.apache.coyote
AbstractProtocol<S>
AbstractConnectionHandler<S, P> (potential match) java.org.apache.coyote.ajp
AjpAprProtocol
AjpNioProtocol
AjpProtocol
java.org.apache.coyote.http11
Http11AprProtocol
Http11NioProtocol
Http11Protocol
java.org.apache.naming.factory.webservices -
ServiceRefFactory
initHandlerChain(QName, HandlerRegistry, HandlerInfo, ArrayList<String>) (2 potential matches)
java.org.apache.tomcat.util.net
AprEndpoint
JIoEndpoint
NioEndpoint =======解释======== 》》》》》》》》》》》》》》》JIoEndpoint》》》》》》》》》》》》》》》》》》》
传说用户发来的请求是在JIoEndpoint的accept函数中接收的,是tomact与外界交互的分界点的更多相关文章
- 在controller的action内, 得到用户发过来的请求地址和参数url
class PController extends Controller{ public function Log() { echo $_SERVER["HTTP_HOST"] . ...
- 微信程序开发系列教程(三)使用微信API给微信用户发文本消息
这个系列的第二篇教程,介绍的实际是被动方式给微信用户发文本消息,即微信用户关注您的公众号时,微信平台将这个关注事件通过一个HTTP post发送到您的微信消息服务器上.您对这个post请求做了应答(格 ...
- PHP公众号开发给用户发微信消息提醒功能
最近做的一个项目,当有用户有资金到账或者成员变动时需要给他发一条微信消息提示.针对这个,开始想使用模板消息,但是刚注册的公众号申请消息模板需要几天时间申请,在时间不足下选择了使用客服消息接口,微信文档 ...
- 一个tcp连接可以发多少http请求
-----来自:松若章 -----zhuanlan.zhihu.com/p/61423830 曾经有这么一道经典面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么?相信大多数准备过的同学 ...
- Java发HTTP POST请求(内容为xml格式)
Java发HTTP POST请求(内容为xml格式) 一.POST请求 服务器地址:http://5.0.217.50:17001/VideoSend 服务器提供的是xml格式的http接口,接口定义 ...
- filter过滤器 默认情况下只对客户端发来的请求有过滤作用 对服务端的跳转不起作用 需要显示的在xml定义过滤的方式才行
filter过滤器 默认情况下只对客户端发来的请求有过滤作用 对服务端的跳转不起作用 需要显示的在xml定义过滤的方式才行
- jquery 发get post请求
https://www.cnblogs.com/summers/p/3225375.html POST 方法不会缓存数据 $.get(URL,callback); 2个参数 callback 参数是请 ...
- 多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- HTTP请求定义不同Content-Type及在SpringMVC如何接收(必看!!!)
前言最近在和三方对接的时候发现了一些问题,这也是我写这篇文章的原因.我大概花了三天时间把这些内容了解,实践,整理,然后分享给大家,希望对大家会有所帮助.废话不多说,在和三方对接的时候我们规定使用jso ...
随机推荐
- win10 64位下VirtualBox安装CentOS6.9
第一步:安装VritualBox 百度“VritualBox”下载安装即可: 第二步:下载Linux镜像系统并安装 这里写出我参照的博客,很详细,我就不累赘了! 原文地址:http://blog.cs ...
- Adobe AIR and Flex - 保存序列化对象文件(译)
创建任何桌面应用程序几乎总是需要在本地存储数据,通过Adobe AIR我们有几下面几个选择,一个是我们能够使用内置的 SQLite 数据库支持,对于少量的数据这是大材小用了.另外一个选择是我们通过把数 ...
- HTTP——学习笔记(8)
HTTP中的一些协议内容会限制某些网站的功能使用 比如,Facebook这类的社交网站,需要实时地观察到海量用户公开发布的内容,而HTTP中的以下标准就会成为瓶颈: 一条连接上只可发送一个请求 请求只 ...
- asp.net 缓存公共类
using System; using System.Collections.Generic; using System.Text; using System.Web; using System.We ...
- 你的Android应用完全不需要那么多的权限
Android系统的权限从用户的角度来看有时候的确有点让人摸不着头脑.有时候可能你只需要做一些简单的事情(对联系人的信息进行编辑),却申请了远超你应用所需的权限(比如访问所有联系人信息的权限). 这很 ...
- 二维码框架ZBarSDK的使用和自己定义二维码扫描界面方法
假设你不知道ZBarSDK怎么用,请下载demo http://download.csdn.net/detail/u013686641/7858917 假设你已经配置好ZBarSDK .那么以下这个类 ...
- UVA10491 - Cows and Cars(概率)
UVA10491 - Cows and Cars(概率) 题目链接 题目大意:给你n个门后面藏着牛.m个门后面藏着车,然后再给你k个提示.在你作出选择后告诉你有多少个门后面是有牛的,如今问你作出决定后 ...
- 如何将网站升级为HTTPS协议(整理)
如何将网站升级为HTTPS协议(整理) 一.总结 一句话总结: 获取证书(有免费有付费):证书是一个二进制文件,里面包含经过认证的网站公钥和一些元数据,要从经销商购买. 安装证书:证书可以放在/etc ...
- 32.智能指针auto_ptr
#include <iostream> #include <memory> #include <string> #include <vector> us ...
- appium使用教程(三)-------------用例编写
1. 驱动 import os, time, unittest from appium import webdriver PATH = lambda p:os.path.abspath(os.path ...