传说用户发来的请求是在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 ...
随机推荐
- 题解 洛谷 P3381 【【模板】最小费用最大流】
发了网络流,再来一发费用流 能做费用流的,网络流自然做得来,但在这还是不要脸的安利一下自己的博客(里面也有网络流的题解): 点我 扯远了... 费用流,就是在不炸水管的情况下求源点到汇点的最小费用. ...
- Android4.2.2下Stagefright下OMX编解码器组件的控制流
本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流. qq:1037701636 email:gzzaigcn2012@gmail.com Android源代码版本号Version ...
- IP address could not be resolved: Temporary failure in name resolution
今早发现mysql日志中有非常多例如以下的警告: 140724 18:41:25 [Warning] IP address '172.16.18.217' could not be resolved: ...
- 大海教你学手游2015CocosLua第一季_00课程介绍
话说大盘从5100直掉到3500点,千仅仅股票跌幅超过20%,跌跌不休.散户.证监会.做空机构開始斗气地主来了: 散户:叫地主 空头:抢地主,3分 证监会:pass 空头:压死 证监会:不要 散户:不 ...
- zzulioj--1828-- 贪心的小猫咪(贪心模拟)
1828: 贪心的小猫咪 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 14 Solved: 4 SubmitStatusWeb Board Des ...
- VS C/C++ 调用lua库(编译出错)
导入 lua.h 之类的头文件后,编译含有Lua函数的时候,可能会出现如下错误: 1>main.obj : error LNK2019: 无法解析的外部符号_luaL_checkinteger, ...
- Kali linux 2016.2(Rolling)中metasploit的搜集特定地址的邮件地址
不多说,直接上干货! 使用search_email_collector搜集特定地址的邮件地址 search_email_collector 要求提供一个邮箱后缀,通过多个搜索引擎的查询结果分析使用此后 ...
- Oracle中根据表明获取对应表触发器名称
Select object_name From user_objects a left join all_triggers b on a.object_Name = b.trigger_name wh ...
- Linux 下易用的光盘镜像管理工具(虚拟光驱软件)转载
作者: Frazer Kline | 2014-11-23 11:07 评论: 4 收藏: 4 分享: 10 磁盘镜像包括了整个磁盘卷的文件或者是全部的存储设备的数据,比如说硬盘,光盘(DVD,C ...
- navigator.mediaDevices.getUserMedia
navigator.mediaDevices.getUserMedia: 作用:为用户提供直接连接摄像头.麦克风的硬件设备的接口 语法: navigator.mediaDevices.getUserM ...