二、tomcat中的HTTP实现
tomcat中http的实现是在Http11*Processor中的process方法中做的。之所以加上*号是因为有Http11Processor,Http11AprProcessor,Http11NioProcessor三种,为什么有三种这里就不做说明,我们仅选第一个即也是最简单的来分析。
下面重点对keepAlive的实现做一下分析。
1、变量说明
keepAlive
布尔型
是否保持keepAlive状态,true表示保持,false表示不保持
maxKeepAliveRequests
int型
最大的保持keepAlive状态的请求数,也就是第一次发出请求建立连接和保持keepAlive后后续的请求之和的最大值,因此,这个最大值是包括第一次建立连接的请求的。因此若其等于1的话,就表示在建立请求之后不能保持keepAlive状态
keepAliveLeft
int型
剩余的可以保持keepAlive的请求数,一开始等于maxKeepAliveRequests 。因此若其等于1的话,就表示除去第一次建立连接外,之后不能保持keepAlive状态
keptAlive
布尔型
表示是第一次请求还是保持keepAlive后的后续请求,false表示是第一次,true表示保持keepAlive后的后续请求
keepAliveTimeout
int型
单位millisecond
保持keepAlive后设置的可以等待下一次请求的时间
soTimeout
int型
单位millisecond
默认的socket timeout 时间,即从设置socket.setSoTimeout后开始计时的等待下一次tcp请求或者可以理解为tcp输入的最长时间,超过这个时间tcp失效
disableUploadTimeout
布尔型
是否为上传设置一个不同的socket timeout时间,false表示不设置,true表示设置
2、重要方法说明
socket.setSoTimeout
设置一个时间,设置后开始计时,在这个时间里等待下一次tcp请求或者可以理解为tcp输入,若没有等到,则tcp失效
3、代码实现
首先,变量声明:
//默认是要保持keepAlive状态的
keepAlive = true;
//剩余的可以保持keepAlive的请求数=最大的保持keepAlive状态的请求数
int keepAliveLeft = maxKeepAliveRequests;
//默认的socket timeout 时间
int soTimeout = endpoint.getSoTimeout();
//当前使用的线程个数
int curThreads = endpoint.getCurrentThreadsBusy();
//可以使用的最大线程个数
int maxThreads = endpoint.getMaxThreads();
if (curThreads > 0 && maxThreads > 0) {
// Only auto-disable keep-alive if the current thread
// usage % can be calculated correctly
//当前使用的线程个数占可以使用的最大线程个数的比率大于0.75
if ((curThreads*100)/maxThreads > 75) {
//剩余的可以保持keepAlive的请求数为1,除去首次建立连接的一次后
//为0, 即首次连接后不能继续保持keepAlive状态
keepAliveLeft = 1;
}
}
try {
//首次设置socket timeout 时间
socket.setSoTimeout(soTimeout);
} catch (Throwable t) {
log.debug(
sm.getString("http11processor.socket.timeout"), t);
error = true;
}
进入循环
//之后处理请求、http协议的处理都在这个循环里进行。http协议里就包括
//keepAlive的实现。
while (started && !error && keepAlive && !endpoint.isPaused())
// Parsing the request header
try {
if (keptAlive) {//
if (keepAliveTimeout > 0) {
socket.setSoTimeout(keepAliveTimeout);
}
else if (soTimeout > 0) {
socket.setSoTimeout(soTimeout);
}
}
inputBuffer.parseRequestLine();
request.setStartTime(System.currentTimeMillis());
keptAlive = true;
if (disableUploadTimeout) {
socket.setSoTimeout(soTimeout);
} else {
socket.setSoTimeout(timeout);
}
inputBuffer.parseHeaders();
} catch (IOException e) {
error = true;
break;
} catch (Throwable t) {
if (log.isDebugEnabled()) {
log.debug(sm.getString("http11processor.header.parse"), t);
}
// 400 - Bad Request
response.setStatus(400);
adapter.log(request, response, 0);
error = true;
}
分享到:
相关推荐
在JavaWeb开发中,HTTP协议、Tomcat服务器和Servlet是三个关键的概念,它们构成了Web应用程序的基础框架。HTTP协议是客户端和服务器之间通信的标准,Tomcat是应用广泛的Java Servlet容器,而Servlet则是Java语言中...
Tomcat 是一个基于 Java 的开源实现的 Servlet 容器,可以运行 Java Servlet 和 JavaServer Pages(JSP)程序,而 Http 协议是万维网(World Wide Web)中使用的主要协议。 首先,我们来了解 JavaEE 规范。JavaEE ...
Tomcat是一款开源的Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范,用于部署和运行Java Web应用。在Android客户端与服务器通信的场景下,Tomcat扮演了接收和响应HTTP请求的角色。 三、HTTP协议...
本文主要介绍了HTTP协议的基本概念和请求响应模型,以及Tomcat作为Servlet容器的工作原理。通过对Tomcat源码的探索,可以深入了解其内部设计,这对于提升Web应用开发和运维能力具有重要意义。无论是HTTP协议的深入...
4. ALPN(Application-Layer Protocol Negotiation):为实现HTTP/2提供了更高效的连接处理。 5. WebSocket增强:除了基本的WebSocket 1.1支持,还添加了更多的控制和管理功能。 6. 更强的可扩展性:通过改进插件...
### 在Tomcat中实现HTTPS安全连接的方法 #### 一、SSL概述 SSL(Secure Socket Layer)是一种用于Web的安全协议,它通过加密数据传输来保护Web通信的安全性。SSL的主要功能是为Web通信提供一个安全通道,确保数据...
Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,是一个开源的Servlet容器,它实现了Java Servlet和JavaServer Pages(JSP)规范。Tomcat7、Tomcat8和Tomcat9是不同版本的Tomcat,每个版本都有其特性和改进...
【服务器原理和协议】 ...总的来说,服务器原理、HTTP协议、Tomcat、Servlet和JSP是构建Web应用的基础,它们共同构成了Web服务的核心机制。理解这些知识点对于进行软件开发,特别是Java Web开发至关重要。
1. mod_jk:安装并配置mod_jk模块后,Apache和Tomcat之间会建立一个工作线程池,Apache将请求分发给线程池中的Tomcat实例。这种方式支持负载均衡和故障转移,可以有效地管理和扩展Web服务器集群。 2. mod_proxy_ajp...
它实现了JK(Java Kona)协议,负责将HTTP请求转发到Tomcat实例,同时将响应返回给客户端。通过配置mod_jk的worker.properties文件来定义Tomcat实例,以及httpd.conf中的mod_jk.conf配置来设置路由规则。 2. ** mod...
7. **连接器与协议**:讲解`Connector`元素在`server.xml`中的配置,包括HTTP、AJP等协议的使用,以及调整连接器参数以优化性能。 8. **安全性**:讨论如何设置用户认证、角色权限和 Realm,以实现基本的访问控制。...
在传统的HTTP协议中,浏览器和服务器之间的通信是基于请求-响应模型的,即每次交互都需要客户端发起请求,服务器才能响应。而WebSocket则允许持久连接,允许数据双向传输,大大减少了延迟,提高了效率,尤其适合实时...
例如,可以通过修改workers.properties文件中的worker列表,实现请求在多个Tomcat实例间的分发,从而提高系统可用性和性能。 总结来说,Apache HttpServer 2.4.X与Tomcat连接器的使用涉及到Apache服务器的模块配置...
在这个“tomcat实现websocket聊天室”的项目中,我们将深入探讨如何利用Tomcat搭建一个具备单聊、群聊、数据库管理以及用户管理功能的聊天室。 首先,我们需要理解WebSocket API的基本概念。WebSocket协议定义了两...
Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目,它是一个开源的、免费的Web应用服务器,实现了Java Servlet和JavaServer Pages(JSP)规范。 【描述】"tomcat的简易源码实现"指的是通过阅读和理解Tomcat...
### Apache和Tomcat实现集群和负载均衡(Windows NT) #### 软件环境 为了实现Apache与Tomcat的集群及负载均衡,在Windows NT环境下需要准备以下软件环境: 1. **Apache**: 版本2.0.55。可以从官方网站...
6. **启动Tomcat**:启动Tomcat服务器,Web服务就会按照指定的端点地址(由`@WebService`注解中的`serviceName`和`endpointInterface`属性决定)运行。 7. **客户端调用**:创建一个Web服务客户端,通过JAX-WS的`...
在单个Tomcat实例中部署多个应用程序是一种常见的场景,尤其是在开发环境中,这种做法可以帮助开发者更高效地管理资源和测试环境。本文档将详细介绍如何在一个Tomcat实例中部署多个Web应用程序,包括必要的步骤、...
2. **环境兼容性**:上述示例在多种环境中进行了测试,包括JDK 7+Tomcat 7.0.47/7.0.52/8.0.3和JDK 7+Glassfish 4等。 3. **注意事项**:在IDE(如Eclipse或MyEclipse)中开发时,需要正确配置Tomcat库路径,直接...