传说用户发来的请求是在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》》》》》》》》》》》》》》》》》》》 
时间: 2024-10-11 03:24:03

传说用户发来的请求是在JIoEndpoint的accept函数中接收的,是tomact与外界交互的分界点的相关文章

小蚂蚁学习APP接口开发(9)—— APP版本升级的接口方法——处理客户端发来的请求数据

今天的笔记主要来记录最后的一个知识要点,APP客户端版本升级的接口开发. APP的开发主要由伟大而神圣的用户来更新,更新的流程应该是这样的: 开启APP--请求初始化接口init.php--检测是否需要更新---否--首页 ---是--更新 在初始化接口的时候,需要客户端发送几个数据: app_id            客户端id,比如: 1,安卓手机 2,iphone手机 version_id        大版本号id version_mini     小版本号id did        

微信程序开发系列教程(三)使用微信API给微信用户发文本消息

这个系列的第二篇教程,介绍的实际是被动方式给微信用户发文本消息,即微信用户关注您的公众号时,微信平台将这个关注事件通过一个HTTP post发送到您的微信消息服务器上.您对这个post请求做了应答(格式为文本),则该应答会通过微信平台投递到您粉丝的微信应用上. 微信开发者中心的文档将这种行为称为"被动回复用户消息": 回复消息报文的格式在开发者文档里也有清晰的定义,是一个xml格式的字符串.我的第二篇教程里也有具体的发送该报文的代码示例. 本文作为这个开发系列的第三篇教程,介绍的是如何

Python发一个GET请求

# -*- coding: utf-8 -*- try: import httplib2 except ImportError: print('错误:') print(' httplib2这个库没有找到,程序无法继续执行!') exit(255) def network_get_proc(self, use_cache = True): '''POST动作''' get_request_str = 'http://192.168.0.54/softlist' # 请求URL # print('-

钉钉接口 给用户发钉盘文件消息

步骤1:获取access_token  (GET) 请求地址:https://oapi.dingtalk.com/gettoken?appkey=key&appsecret=secret 返回说明 { "errcode": 0, "errmsg": "ok", "access_token": "fw8ef8we8f76e6f7s8df8s" } 步骤2:调用“单步上传文件”接口,上传文件获取medi

多级反向代理下,Java获取请求客户端的真实IP地址多中方法整合

在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了. 如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为 http://www.javapeixun.com.cn / 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.

用三个函数分别实现求三角形,正方形,圆形面积(所有底高半径都由用户 输入);在主函数中,通过用户不同的选择分别进行调用;

/*2.用三个函数分别实现求三角形,正方形,圆形面积(所有底高半径都由用户输入):在主函数中,通过用户不同的选择分别进行调用:*/ #include <stdio.h>#define P 3.14double sanjiao(double di,double gao){ double mianji = (di * gao)/2 ; return mianji;} double zhengfangxing(double bian){ double mianji2 = bian*bian; ret

ajax提交请求为啥url要用这个函数encodeURI

参考如下: 如果你是通过form提交的,那就不需要用这个了.但是如果是你使用url的方式例如:ajax提交到后台的,就需要对url进行encodeURI编码,否则,会导致后台出现各种乱码,不加encodeURI的话,默认浏览器编码格式提交,这样的话,浏览器不同,传到后台的值也就不同了,所以建议使用encodeURI统一编码为utf-8的格式到后台,然后后台再处理再解码就行了,如果后台是utf-8的,好像也可以不手动解码,但是建议加上解码,避免发布环境不同的时候,会出现问题. http://zhi

完整的http请求在IIS和asp.net framework中的处理流程

完整的http请求在IIS和asp.net framework中的处理流程: HttpRequest-->inetinfo.exe-->IIS的.net扩展程序ASPNET_ISAPI.DLL-->Http Pipeline-->ASP.NET工作者进程ASPNET_WP.EXE(IIS5.0中)/w3wp.exe(IIS6.0以上版本)进行以下处理-->ISAPIRuntime-->HttpRuntime-->HttpApplication Factory--&

处理文件,用户指定要查找的文件和内容,讲文件中包含要查找内容的每一行都要输出到屏幕

处理文件,用户指定要查找的文件和内容,讲文件中包含要查找内容的每一行都要输出到屏幕: 预先有一个名为 cars.py 的文件,其内容为: cars = ['honda','yamaha','suzuki'] print(cars) cars[0] = 'ducati' print(cars) cars.append('马大哈') print(sorted(cars)) print(cars) 接下来写生成代码: def check_file(): # 创建一个名为 check_file 的生成器