传说用户发来的请求是在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 ...
随机推荐
- 紫书 例题 11-6 UVa 658 (状态压缩+隐式图搜索+最短路)
这道题用到了很多知识点, 是一道好题目. 第一用了状态压缩, 因为这里最多只有20位, 所以可以用二进制来储存状态 (要对数据范围敏感), 然后 涉及到了一些位运算. 第二这里是隐式 ...
- MYSQL锁表问题的解决方法
本文实例讲述了MYSQL锁表问题的解决方法.分享给大家供大家参考,具体如下: 很多时候!一不小心就锁表!这里讲解决锁表终极方法! 案例一 mysql>show processlist; 参看sq ...
- Android源代码解析之(十三)-->apk安装流程
转载请标明出处:一片枫叶的专栏 上一篇文章中给大家分析了一下android系统启动之后调用PackageManagerService服务并解析系统特定文件夹.解析apk文件并安装的过程,这个安装过程实 ...
- 批量修改文件的编码格式至UTF-8
批量修改文件的编码格式至UTF-8 学习了: https://jingyan.baidu.com/article/e8cdb32b47a1ea37042bad11.html http://blog.c ...
- 怎样創建 iOS 展開式 UITableView?
原文:http://www.appcoda.com.tw/expandable-table-view/ 译者:kmyhy(appcoda的驻站译者) 幾乎全部的 App 都會以導航的方式向用戶展示多個 ...
- 纯CSS实现小圆点和三角形图案
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 4、java变量、函数、基本类型的值传递、分支、循环、流程控制
一.全局变量(global).局部变量(local).动态变量(dynamic).静态变量(static) 在类中的变量为全局变量,在方法函数中为局部变量,局部变量必须有人为赋的初值,全局变量的初值是 ...
- DM8168 屏蔽 PCIe
DM8168新板在没有做PCI接口的情况下,能够把PCI模块凝视,直接尝试: make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm menuconfi ...
- RvmTranslator7.1
RvmTranslator7.1 eryar@163.com RvmTranslator can translate the RVM file exported by AVEVA Plant(PDMS ...
- [Android Studio 权威教程]配置出“NB”的Android Studio
前几篇博客我们已经安装好了As,并且创建了我们的第一个HelloWrod ,这片blog我们继续配置出一个NB的Android Studio 假设你是一个才開始接触到AS或者想从Eclipse转型到A ...