其实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开启了一个端口进行请求的监听。
分享到:
相关推荐
总的来说,"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的会话管理...