Connection: keep-alive 简介

一、在使用fiddler抓包工具会出现如下场景

 二、keep-alive 保持连接

 "Connection: keep-alive" 是 HTTP 协议中的一个头部字段,用于指示客户端和服务器之间的连接是否保持活跃状态。

当客户端发送一个 HTTP 请求给服务器时,可以在请求头部中包含 "Connection: keep-alive" 字段,这表示客户端希望与服务器保持持久连接。这意味着一旦服务器响应完请求后,连接不会立即关闭,而是会保持打开状态一段时间,以便后续可能发送的请求可以在同一连接上进行。这样可以减少因频繁建立和关闭连接而产生的性能开销。

即使请求头部中包含了 "Connection: keep-alive" 字段,服务器也可以选择在响应中关闭连接,或者在一定时间后自动关闭连接。但通常情况下,如果客户端和服务器都支持持久连接,并且请求头部中包含了 "Connection: keep-alive" 字段,那么连接就会保持活跃状态一段时间,以便后续的请求可以复用这个连接。

三、实现 请求头关闭保持(客户端)

3.1使用 Python

的 requests 库发送 HTTP 请求,你可以通过以下方式设置:

import requests

headers = {'Connection': 'close'}
response = requests.get('http://example.com', headers=headers)

3.2使用 jQuery 的 AJAX 方法发送请求

$.ajax({
    url: 'http://example.com',
    method: 'GET',
    headers: {'Connection': 'close'},
    success: function(response) {
        // 请求成功时的处理逻辑
        console.log('请求成功:', response);
    },
    error: function(xhr, status, error) {
        // 请求失败时的处理逻辑
        console.error('请求失败:', status, error);
    }
});

3.3当不写 connection,客户端默认会保持请求连接

当客户端不显式设置 "Connection" 头部时,默认情况下,大多数现代的 HTTP 客户端会采用持久连接(keep-alive)的方式来发送请求。这意味着客户端会尝试在请求完成后保持连接打开状态,以便在同一连接上发送后续的请求。

持久连接可以提高性能,因为它减少了因频繁建立和关闭连接而带来的开销。然而,并非所有的服务器都支持持久连接,也不是所有的客户端都会使用它。因此,服务器可能会在响应完成后关闭连接,或者客户端可能会选择在每个请求后关闭连接,这取决于具体的实现和配置。

四、服务器配置

Java Servlet 中,你可以通过设置响应头部来控制连接的保持和关闭。具体地说,你可以在 Servlet 中使用 HttpServletResponse 对象来设置响应头部。

要配置持久连接(keep-alive),你可以在 Servlet 的 doGet() 或 doPost() 方法中添加如下代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 设置响应头部,指示客户端保持连接
    response.setHeader("Connection", "keep-alive");
    
    // 其他处理逻辑...
}

要配置关闭连接,在响应完成后,你可以将连接设置为 "close":

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 设置响应头部,指示客户端关闭连接
    response.setHeader("Connection", "close");
    
    // 其他处理逻辑...
}

 当服务器响应json数据后,如果间隔task任务时间再发送json则不需要 二次请求

String respondJson = "{\"status\":\"" + tag + "\"}";

			// 设置响应的内容类型为application/json
			response.setContentType("application/json");
			response.setCharacterEncoding("UTF-8");
			// 获取响应的输出流
			PrintWriter out = response.getWriter();
			// 将JSON字符串写回客户端
			out.println(respondJson);
			out.flush();

要定时关闭连接,你可以设置一个特定的超时时间,然后在超时后关闭连接。这可以通过使用 Servlet 的 AsyncContext 和定时器来实现。下面是一个简单的示例代码,演示了如何在一定时间后关闭连接:

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns = "/example", asyncSupported = true)
public class ExampleServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应的内容类型为application/json
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        
        // 获取响应的输出流
        PrintWriter out = response.getWriter();
        
        // 创建异步上下文
        final AsyncContext asyncContext = request.startAsync();
        
        // 设置定时器,在一定时间后关闭连接
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                // 关闭异步上下文
                asyncContext.complete();
                // 取消定时器
                cancel();
            }
        }, 5000); // 5000毫秒后关闭连接
        
        // 将JSON字符串写回客户端
        String respondJson = "{\"status\":\"ok\"}";
        out.println(respondJson);
        out.flush();
    }
}

 在这个示例中,我们使用了一个定时器来在一定时间后关闭异步上下文。在 doGet() 方法中,我们首先设置了响应的内容类型,并获取了响应的输出流。然后,我们创建了一个异步上下文对象,并使用定时器在 5000 毫秒后关闭了这个异步上下文,即关闭连接。最后,我们将 JSON 字符串写回客户端。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/552492.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云4核8G云服务器价格多少钱?700元1年

阿里云4核8G云服务器价格多少钱?700元1年。阿里云4核8G服务器租用优惠价格700元1年,配置为ECS通用算力型u1实例(ecs.u1-c1m2.xlarge)4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选,CPU采用Intel(R) Xeon(R…

储能系统--BMS电流采样详解

一、行业标准介绍 汽车电池管理系统 储能电池管理系统 二、BMS电流采样 (1)电流采样的作用 电流传感器一般会位于动力电池系统主正或主副回路测量整个电池包的电流,电流信号会送到BMS,给BMS做充放电控制,电池SOC、SO…

pip安装swig@FreeBSD

SWIG (Simplified Wrapper and Interface Generator) 是一个用于连接 C/C 代码与其他高级编程语言(如Python、Java、C# 等)的工具。它允许开发人员将现有的 C/C 代码封装成可以在其他语言中调用的接口,而无需手动编写大量的代码。 SWIG 的工…

编程入门(三)【GPT工具的使用】

读者大大们好呀!!!☀️☀️☀️ 🔥 欢迎来到我的博客 👀期待大大的关注哦❗️❗️❗️ 🚀欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言背景了解GPT工具使用技巧GPT工具在学习和工作中的应用 前言 背景了解 2…

OpenStack云平台实战

1、环境准备 主机CPU数量内存硬盘IPV4发行版controller48GB100GBens33: 192.168.110.27/24 esn34: 192.168.237.131/24CentOS 7.9compute48GB200GB、100GBens33: 192.168.110.26/24 esn34: 192.168.237.132/24CentOS 7.9 1.1 虚拟机安装部署 1.1.1 创建虚拟机 这里16或者17都…

工业级3D可视化工具HOOPS Visualize, 快速构建移动端和PC端工程应用程序!

HOOPS Visualize是一款强大的工业级3D渲染引擎,帮助您打造出众的工程应用程序。HOOPS Visualize的基石是图形内核,这是一种全功能的,以工程为重点的场景图技术,我们称为Core Graphics。Core Graphics集成到一个框架中,…

【STM32】嵌入式实验二 GPIO 实验 (前三个设计)

1. 按键亮灯 设计 GPIO 实验项目 1,功能:当按键 KB1 按下时,实验板上全彩发光二极管周边 的发光二极管全亮,当按键 KB2 按下时跑马灯 D0 闪亮。 实验要求基于寄存器的GPIO配置,所以需要手动操作寄存器来配…

轻松上手Flowise:本地部署与最佳实践

🧙‍♂️ 诸位好,吾乃斜杠君,编程界之翘楚,代码之大师。算法如流水,逻辑如棋局。 📜 吾之笔记,内含诸般技术之秘诀。吾欲以此笔记,传授编程之道,助汝解技术难题。 &#…

Sigmoid激活函数

Sigmoid函数是一种常用的激活函数,其数学公式为: σ ( x ) 1 1 e − x \sigma(x) \frac{1}{1 e^{-x}} σ(x)1e−x1​ 其中, x x x 是函数的输入, σ ( x ) \sigma(x) σ(x) 是函数的输出。 sigmoid函数在神经网络中常被用于…

32.5k star!发现一个新的 API 调试工具!postman 要被替换了【文末有项目源码】

在软件开发过程中,API(应用程序接口)扮演着至关重要的角色。为了确保 API 的可靠性和性能,开发人员需要一种高效的方式来测试和调试它们。这方面的工具,大家经常用到的应该就是 postman 了。不过,今天想要给…

算法与数学

学过数据结构的对这个应该都不会感到陌生,但是乍一看原来是数学,然而事实就是如此。二分法的数学源头就是这个。 还有前缀和的 我们这里所说的前缀和其实就是我们在高中学的数列中的Sn(前n项和),只是我们这里需要将S1 , S2 , S3 , S4 …… S…

用户与组管理

一、用户分类 管理员用户:root 程序用户 普通用户 二、用户列表文件 查看用户列表文件 cat /etc/passwd 注:etc/passwd内容总共分为7个区域,每个区域用“:”分隔开 第一列:用户名。区分大小写;用户名可以使…

多轴机械臂/正逆解/轨迹规划/机器人运动学/Matlab/DH法 学习记录03——机械臂运动学逆解

系列文章目录 本科毕设正在做多轴机械臂相关的内容,这里是一个学习机械臂运动学课程的相关记录。 如有任何问题,可发邮件至layraliufoxmail.com问询。 1. 数学基础 2. 机械臂几何法与DH表示法 3. 机械臂运动学逆解 文章目录 系列文章目录一、引言1.手臂…

Impala Daemon无法启动问题记录(UNIX 域套接字路径不存在)

前言:集群扩节点,新加节点的Impala Daemon起不起来了 去后台查看报错日志 上午11点19:08.002分 ERROR cc:288 Invalid short-circuit reads configuration:Impala cannot read or execute the parent directory of dfs.domain.socket.path 上午11点19:…

【SAP NWDI】服务开启:SLD,CM,CMS(二)

一、启用System Landscape Directory 二、启用 NWDI using CMS

pycharm 更换Eclipse 的按键模式 keymap

流程 整体来说比较简单,其实只要下载一个eclipse keymap插件就可以完成 首先 ctrl alt s 打开设置页面,找到 plugin 安装完成后还是在 settings 下切换到 keymap即可以看到eclipse 的按键设置出现了,应用后ok 即可完成 再去试试&#x…

考研数学|「基础」和「强化」阶段分别怎么做?

从目前考研数学的趋势来看,更加注重数学基础的理解和计算量。也就是基础知识和计算,如何锻炼这两种能力就显得尤为重要。希望我的复习经验可以给到读者一些启发。 数学规划 从备考过程来看,数学的复习可以分为三个阶段:1、基础阶…

深入理解GCC/G++在CentOS上的应用

文章目录 深入理解GCC/G在CentOS上的应用编译C和C源文件C语言编译C语言编译 编译过程的详解预处理编译汇编链接 链接动态库和静态库静态库和动态库安装静态库 结论 深入理解GCC/G在CentOS上的应用 在前文的基础上,我们已经了解了CentOS的基本特性和如何在其上安装及…

每日一VUE——响应性原理(重要的一批!!!)

文章目录 响应性原理setup副作用函数Proxy响应式数据 响应式APIreactive和reftoRef和toRefscomputedwatchprovide和inject 响应性原理 响应性本质是监听数据变化,并做出相应的处理 setup setup函数就是生命周期函数,它替代了beforeCreate和created函数…

C语言—深度剖析函数指针,函数指针数组

我们先来看一段代码 #include <stdio.h> void test() {printf("hehe\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; }输出的是两个地址&#xff0c;这两个地址是 test 函数的地址。 那我们的函数的地址…