首页 > 代码库 > 传说用户发来的请求是在JIoEndpoint的accept函数中接收的,是tomact与外界交互的分界点

传说用户发来的请求是在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    AjpProtocoljava.org.apache.coyote.http11      Http11AprProtocol    Http11NioProtocol    Http11Protocoljava.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与外界交互的分界点