HTTP1.1长连接 NoHttpResponseException问题

本文讨论了在使用httpclient-4.4.1.jar时遇到的NoHttpResponseException错误,该错误可能由于服务器关闭了HTTP连接而客户端仍尝试使用同一连接请求数据。HTTP1.1默认启用长连接,但服务器可能会关闭空闲连接。为解决此问题,提出了采用ConnectionKeepAliveStrategy设置连接超时策略,并启用失败重发策略应对NoHttpResponseException异常,以确保连接的有效性和请求的可靠性。
摘要由CSDN通过智能技术生成

大脑系统偶尔NoHttpResponseException错误,

httpclient-4.4.1.jar

初步诊断为是对方服务器关闭了http连接,而己方仍在用这个连接请求数据

http1.1默认是长连接的,多个请求可以在一个连接中传输,但对方服务器会关闭空闲的连接。

需要进一步确认,http连接策略,和tcp连接。

要主动关闭默认http1.1d长连接导致的过期连接和限制链接

新增连接长连接超时策略,ConnectionKeepAliveStrategy 

和开启

.evictExpiredConnections()//设置这两项,会开启定时任务清理过期和闲置的连接
.evictIdleConnections(IDLE_TIME, TimeUnit.MILLISECONDS)

同时新增失败重发策略,对于NoHttpResponseException异常进行重发。

        CLIENT = HttpClients.custom()
                    .setConnectionTimeToLive(ALIVE_TIME, TimeUnit.MILLISECONDS)
                    .setKeepAliveStrategy(keepAliveStrategy)
                    .setConnectionManager(connecManager)
                    .setRetryHandler(retryHandler)
                    .evictExpiredConnections()//设置这两项,会开启定时任务清理过期和闲置的连接
                    .evictIdleConnections(IDLE_T
以下是一个 HTTP/1.1 长连接的前后端示例: 前端(JavaScript): ```javascript // 创建一个 XMLHttpRequest 对象 var xhr = new XMLHttpRequest(); // 打开一个 GET 请求,指定 URL 和是否使用异步请求 xhr.open('GET', '/api/data', true); // 设置 HTTP 头部,指定请求的数据类型 xhr.setRequestHeader('Accept', 'application/json'); // 监听请求状态的变化 xhr.onreadystatechange = function() { // 判断请求是否完成 if (xhr.readyState === XMLHttpRequest.DONE) { // 判断响应是否成功 if (xhr.status === 200) { // 处理响应数据 var data = JSON.parse(xhr.responseText); console.log(data); } else { // 处理响应错误 console.error('Request failed: ' + xhr.statusText); } } }; // 发送 HTTP 请求 xhr.send(); ``` 后端(Node.js): ```javascript var http = require('http'); // 创建一个 HTTP 服务器 var server = http.createServer(function(req, res) { // 判断请求的 URL 是否为 /api/data if (req.url === '/api/data') { // 设置 HTTP 头部,指定响应的数据类型 res.setHeader('Content-Type', 'application/json'); // 发送响应数据 res.write(JSON.stringify({ message: 'Hello, World!' })); // 结束响应 res.end(); } else { // 发送 404 错误 res.statusCode = 404; res.end(); } }); // 监听 8080 端口 server.listen(8080); ``` 在这个示例中,前端通过 XMLHttpRequest 对象向后端发送一个 GET 请求,请求的 URL 为 /api/data。后端判断请求的 URL 是否为 /api/data,如果是则返回一个 JSON 格式的响应数据,否则返回一个 404 错误。由于 HTTP/1.1 支持长连接,因此在前端发送第一个请求后,该连接会保持打开状态,以便在稍后的时间内可以继续使用该连接发送和接收数据。如果需要关闭连接,可以使用 XMLHttpRequest 对象的 abort() 方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值