其实tomcat在哪个类中监听请求的代码很容易找到:
在org.apache.tomcat.util.net.JIoEndpoint$Acceptor#run()中的这么一句:
Socket socket = serverSocketFactory.acceptSocket(serverSocket);
可是ServerSocketFactory是个抽象类,我还是很想知道整个过程的来龙去脉的。
那就要还是从初始化开始,当Tomcat的HTTP Connector初始化,会org.apache.coyote.http11.Http11Protocol调用它的init()方法。
在这个init()方法中,又调用了org.apache.tomcat.util.net.JIoEndpoint#init(),代码如下:
public void init() throws Exception { if (initialized) return; // acceptor线程的数量 if (acceptorThreadCount == 0) { acceptorThreadCount = 1; } // 返回DefaultServerSocketFactory类对象做为ServerSocketFactory的实例 if (serverSocketFactory == null) { serverSocketFactory = ServerSocketFactory.getDefault(); } // 创建ServerSocket if (serverSocket == null) { try { if (address == null) { serverSocket = serverSocketFactory.createSocket(port, backlog); } else { serverSocket = serverSocketFactory.createSocket(port, backlog, address); } } catch (BindException be) { if (address == null) throw new BindException(be.getMessage() + "<null>:" + port); else throw new BindException(be.getMessage() + " " + address.toString() + ":" + port); } } initialized = true; }
现在已经知道了文章最初提到的serverSocketFactory引用的是一个DefaultServerSocketFactory类的对象。并且在这里创建了一个ServerSocket对象。
当Tomcat初始化完毕执行一些列开启服务的动作时,HTTP Connector也会执行它的start()方法,然后会调用Http11Protocol的start()方法,最后程序会执行到JIoEndpoint#start(),下面来看一下:
public void start() throws Exception { if (!initialized) { init(); } if (!running) { running = true; paused = false; // 先初始化一些Worker if (executor == null) { workers = new WorkerStack(maxThreads); } // 开启Acceptor线程,默认只开启一个Acceptor线程,见JIoEndpoint#init()。 for (int i = 0; i < acceptorThreadCount; i++) { Thread acceptorThread = new Thread(new Acceptor(), getName() + "-Acceptor-" + i); acceptorThread.setPriority(threadPriority); acceptorThread.setDaemon(daemon); acceptorThread.start(); } } }
这样,就开启了一个Acceptor线程,接下来看一看这个线程做了什么东西。
public void run() { while (running) { while (paused) { try { Thread.sleep(1000); } catch (InterruptedException e) { } } try { // 开始监听端口 Socket socket = serverSocketFactory.acceptSocket(serverSocket); // 初始化Socket serverSocketFactory.initSocket(socket); if (!processSocket(socket)) { try { socket.close(); } catch (IOException e) { } } } catch (IOException x) { if (running) log.error(sm.getString("endpoint.accept.fail"), x); } catch (Throwable t) { log.error(sm.getString("endpoint.accept.fail"), t); } } }
至此,Tomcat开启了一个端口进行请求的监听。
发表评论
-
出现java.lang.UnsupportedClassVersionError 错误的原因
2010-08-16 23:11 867出现java.lang.UnsupportedClassVer ... -
Tomcat请求处理(七) - Servlet实例的调用
2009-05-07 11:36 1125Tomcat请求处理中Servlet实例的调用是和Filter ... -
请求在Tomcat中传到了CoyoteAdapter的#service()方法中后,就要准备进入Pi
2009-05-07 11:35 1797首先,来看一下Servlet的载入过程。 具体是在org.ap ... -
Tomcat请求处理(五) -- 请求在容器间的流动
2009-05-07 11:34 1427请求在Tomcat中传到了CoyoteAdapter的#ser ... -
Tomcat请求处理(四) -- Request, Response, 和Pipeline
2009-05-07 11:33 12811. Request和Response 当处理请求的时候,To ... -
Tomcat请求处理(三) -- coyote请求处理
2009-05-07 11:32 1319在上一篇文章文章中,Tomcat的请求处理到了JIoEndpo ... -
Tomcat请求处理(二) -- 请求处理框架
2009-05-07 11:30 983书接上文。 当Tomcat的Acceptor监听到有请求到来时 ... -
Tomcat启动部分源代码分析(五) -- 应用程序加载
2009-05-07 11:28 1194前面所叙述的tomcat启动 ... -
Tomcat启动部分源代码分析(四) -- 开启容器
2009-05-07 11:27 1199四. 开启容器 最后是Bootstrap#start()方法的 ... -
Tomcat启动部分源代码分析(三) -- 载入
2009-05-07 11:23 1187二. 载入 2. Bootstrap的#Bootstrap#l ... -
Tomcat启动部分源代码分析(二) -- 初始化
2009-05-07 11:20 1092二. 初始化 1. 首先是Bootstrap的#init()操 ... -
Tomcat启动部分源代码分析(一) -- 概览
2009-05-07 11:17 1426一. 概览 本文所涉及的Tomcat为6.0版本。 Tomca ... -
Tomcat的Session管理(二) - Session后台处理
2009-05-07 10:10 967Tomcat会开启一个后台线程每隔一段时间检查Session的 ... -
Tomcat的Session管理(一) - Session的生成
2009-05-07 10:02 1489Session对象的创建一般是源于这样的一条语句: Sessi ...
相关推荐
总的来说,"tomcat85-session-redis工具jar包"是一个增强Tomcat性能和可扩展性的实用工具,它通过整合Redis实现了session的分布式管理,对于需要处理大量并发用户请求且要求高可用性的Web应用来说,这是一个非常有...
Apache Tomcat是一个开源的Web服务器和Java应用服务器,主要用于运行Java Servlet和JavaServer Pages(JSP)技术。这个"apache-tomcat-8.5.47-windows-x64.zip"压缩包是针对Windows 64位系统的Tomcat 8.5.47版本。在...
Apache Tomcat是一个开源的软件应用服务器,主要用于运行Java Servlets和JavaServer Pages(JSP)。在本案例中,我们讨论的是Apache Tomcat的8.5.45版本,专为64位Windows操作系统设计的安装包。这个压缩文件`apache...
此外,还需要在Tomcat的`conf/server.xml`文件中配置AJP监听器,以便Tomcat可以接收来自`mod_jk`的请求。通过这种方式,Apache HTTP Server可以作为前端服务器处理静态内容,而Tomcat则专注于处理Java Web应用程序,...
在部署和配置过程中,用户需要将正确的连接器模块加载到Apache配置文件(如httpd.conf)中,设置相应的监听端口和协议,确保Apache能够识别并转发请求给Tomcat。同时,还需要正确配置Tomcat服务器,以便接受来自...
这两个类实现了`Connector`接口,负责监听端口、接收请求并转发给相应的Servlet容器处理。 二、Http11Protocol详解 1. 请求接收:`Http11Processor`类是Http11Protocol的核心,它负责解析接收到的HTTP请求数据,将...
"conf"目录存储了Tomcat的配置文件,如`server.xml`,它是核心配置文件,定义了服务器的各个部分,包括监听端口、连接器、虚拟主机等。"webapps"目录是默认的Web应用程序部署位置,你可以将WAR文件或已解压的Web应用...
5. **连接器与端口**:Tomcat通过Connector组件与网络通信,通常默认监听8080端口处理HTTP请求。可以在server.xml的元素中更改端口设置。 6. **安全性**:Tomcat提供基于角色的访问控制(RBAC)以及SSL/TLS支持,...
- `server.xml`:这是Tomcat的主配置文件,包含服务器的端口设置、Connector配置(处理不同协议,如HTTP/HTTPS)、Context配置(定义每个Web应用的路径和属性)等。 - `context.xml`:可以用来定义特定Web应用的...
- ** Coyote**:处理HTTP连接的组件,负责监听端口并响应请求。 - **Jasper**:负责JSP编译成Servlet的引擎。 - **Commons Daemon**:用于Windows平台的服务控制。 5. **安全管理:** - **设置用户和角色**:...
64位版本的Tomcat可以利用更多的内存,这对于处理大量请求或者运行大型Web应用程序的服务器来说非常重要。 3. **免安装版本**: 免安装版本的Apache Tomcat不需要通过传统的安装程序进行安装,而是可以直接解压缩到...
在安装和配置Tomcat时,你需要修改`conf/server.xml`来设置端口号、服务器监听地址和其他配置。同时,为了安全考虑,你可能需要调整`conf/tomcat-users.xml`以添加用户和角色,进行基本的身份验证。 使用Tomcat进行...
Apache Tomcat 8.0.28 是一个广泛使用的开源软件,主要作为Java Servlet和JavaServer Pages(JSP)的Web应用服务器。Tomcat是Apache软件基金会Jakarta项目的一部分,它实现了Java EE(现称为Jakarta EE)的Web部分,...
- `server.xml`是核心配置文件,你可以在这里定义服务器的端口号、连接器、监听器、全局JNDI资源等。 - `context.xml`可以用来配置特定应用程序的属性,例如数据源或会话超时。 3. **启动与关闭**: - 在命令行...
Apache Tomcat 7.0.96 ...总之,Apache Tomcat 7.0.96是一个功能强大且易于使用的Web服务器,适合初学者和经验丰富的开发者。通过深入理解其配置、管理和安全机制,可以更好地利用Tomcat搭建高效、安全的Java Web环境。
5. **连接器与端口**:Tomcat通过Connector组件处理HTTP请求,缺省情况下监听8080端口。可以在`server.xml`的`<Connector>`标签中修改端口号。 6. **JNDI资源**:Tomcat支持JNDI(Java Naming and Directory ...
这个文件通常包含了Tomcat服务器的所有核心组件,如Catalina(核心Servlet容器)、 Coyote(连接器处理HTTP请求)、 Jasper(JSP编译器),以及其他必要的库和配置文件。 在实际使用中,部署Tomcat时,你需要解压这...
1. **接收请求**:当客户端发送HTTP请求到Tomcat时,服务器会通过网络监听端口捕获该请求。 2. **解析请求**:Tomcat将接收到的原始字节流转换为HTTP请求对象,解析请求头和请求体。 3. **调度请求**:基于请求的URL...
然后,通过Catalina创建并初始化各个组件,如Connector(监听端口)和Executor(线程池)。接着,Coyote处理接收到的HTTP请求,转发给对应的Servlet进行处理。 4. **会话管理** Tomcat提供了基于cookie的会话管理...