基于HTTP的长轮询简单实现_哇偶哇偶Z的博客-CSDN博客_http长轮询


本站和网页 https://blog.csdn.net/ddwddw4/article/details/95060303 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

基于HTTP的长轮询简单实现_哇偶哇偶Z的博客-CSDN博客_http长轮询
基于HTTP的长轮询简单实现
哇偶哇偶Z
于 2019-07-08 14:49:21 发布
22565
收藏
52
分类专栏:
JS基础
JS基础
专栏收录该内容
103 篇文章
1 订阅
订阅专栏
Web客户端与服务器之间基于Ajax(http)的常用通信方式,分为短连接与长轮询。
短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
在长轮询机制中,客户端像传统轮询一样从服务器请求数据。然而,如果服务器没有可以立即返回给客户端的数据,则不会立刻返回一个空结果,
而是保持这个请求等待数据到来(或者恰当的超时:小于ajax的超时时间),之后将数据作为结果返回给客户端。
长轮询机制如下图所示:
web客户端代码如下:
//向后台长轮询消息
function longPolling(){
$.ajax({
async : true,//异步
url : 'longPollingAction!getMessages.action',
type : 'post',
dataType : 'json',
data :{},
timeout : 30000,//超时时间设定30秒
error : function(xhr, textStatus, thrownError) {
longPolling();//发生异常错误后再次发起请求
},
success : function(response) {
message = response.data.message;
if(message!="timeout"){
broadcast();//收到消息后发布消息
longPolling();
});
web服务器端代码如下:
public class LongPollingAction extends BaseAction {
private static final long serialVersionUID = 1L;
private LongPollingService longPollingService;
private static final long TIMEOUT = 20000;// 超时时间设置为20秒
public String getMessages() {
long requestTime = System.currentTimeMillis();
result.clear();
try {
String msg = null;
while ((System.currentTimeMillis() - requestTime) < TIMEOUT) {
msg = longPollingService.getMessages();
if (msg != null) {
break; // 跳出循环,返回数据
} else {
Thread.sleep(1000);// 休眠1秒
if (msg == null) {
result.addData("message", "timeout");// 超时
} else {
result.addData("message", msg);
} catch (Exception e) {
e.printStackTrace();
return SUCCESS;
public LongPollingService getLongPollingService() {
return longPollingService;
public void setLongPollingService(LongPollingService longPollingService) {
this.longPollingService = longPollingService;
转载自: https://www.e-learn.cn/content/jquery/1155365
一、什么是长连接、长轮询?
用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息。这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已。
二、长连接、长轮询的应用场景
长连接、长轮询一般应用与WebIM、ChatRoom和一些需要及时交互的网站应用中。其真实案例有:WebQQ、Hi网页版、Facebook IM等。
如果你对服务器端的反向Ajax感兴趣,可以参考这篇文章 DWR 反向Ajax 服务器端推的方式:http://www.cnblogs.com/hoojo/category/276235.html
欢迎大家继续支持和关注我的博客:
http://hoojo.cnblogs.com
http://blog.csdn.net/IBM_hoojo
也欢迎大家和我交流、探讨IT方面的知识。
email:hoojo_@126.com
三、优缺点
轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。  优点:后端程序编写比较容易。  缺点:请求中有大半是无用,浪费带宽和服务器资源。  实例:适于小型应用。
长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。  优点:在无消息的情况下不会频繁的请求,耗费资源小。  缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。  实例:WebQQ、Hi网页版、Facebook IM。
长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。  优点:消息即时到达,不发无用请求;管理起来也相对方便。  缺点:服务器维护一个长连接会增加开销。  实例:Gmail聊天
Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。  优点:实现真正的即时通信,而不是伪即时。  缺点:客户端必须安装Flash插件;非HTTP协议,无法自动穿越防火墙。  实例:网络互动游戏。
四、实现原理
所谓长连接,就是要在客户端与服务器之间创建和保持稳定可靠的连接。其实它是一种很早就存在的技术,但是由于浏览器技术的发展比较缓慢,没有为这种机制的实现提供很好的支持。所以要达到这种效果,需要客户端和服务器的程序共同配合来完成。通常的做法是,在服务器的程序中加入一个死循环,在循环中监测数据的变动。当发现新数据时,立即将其输出给浏览器并断开连接,浏览器在收到数据后,再次发起请求以进入下一个周期,这就是常说的长轮询(long-polling)方式。如下图所示,它通常包含以下几个关键过程:
1. 轮询的建立  建立轮询的过程很简单,浏览器发起请求后进入循环等待状态,此时由于服务器还未做出应答,所以HTTP也一直处于连接状态中。  2. 数据的推送  在循环过程中,服务器程序对数据变动进行监控,如发现更新,将该信息输出给浏览器,随即断开连接,完成应答过程,实现“服务器推”。  3. 轮询的终止  轮询可能在以下3种情况时终止:    3.1. 有新数据推送     当循环过程中服务器向浏览器推送信息后,应该主动结束程序运行从而让连接断开,这样浏览器才能及时收到数据。    3.2. 没有新数据推送     循环不能一直持续下去,应该设定一个最长时限,避免WEB服务器超时(Timeout),若一直没有新信息,服务器应主动向浏览器发送本次轮询无新信息的正常响应,并断开连接,这也被称为“心跳”信息。    3.3. 网络故障或异常     由于网络故障等因素造成的请求超时或出错也可能导致轮询的意外中断,此时浏览器将收到错误信息。  4. 轮询的重建  浏览器收到回复并进行相应处理后,应马上重新发起请求,开始一个新的轮询周期。
五、程序设计
1、普通轮询 Ajax方式
客户端代码片段
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="author" content="hoojo & http://hoojo.cnblogs.com">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<%@ include file="/tags/jquery-lib.jsp"%>
<script type="text/javascript">
$(function () {
window.setInterval(function () {
$.get("${pageContext.request.contextPath}/communication/user/ajax.mvc",
{"timed": new Date().getTime()},
function (data) {
$("#logs").append("[data: " + data + " ]
");
});
}, 3000);
});
</script>
</head>
<body>
<div id="logs"></div>
</body>
</html>
客户端实现的就是用一种普通轮询的结果,比较简单。利用setInterval不间断的刷新来获取服务器的资源,这种方式的优点就是简单、及时。缺点是链接多数是无效重复的;响应的结果没有顺序(因为是异步请求,当发送的请求没有返回结果的时候,后面的请求又被发送。而此时如果后面的请求比前面的请求要先返回结果,那么当前面的请求返回结果数据时已经是过时无效的数据了);请求多,难于维护、浪费服务器和网络资源。
服务器端代码
@RequestMapping("/ajax")
public void ajax(long timed, HttpServletResponse response) throws Exception {
PrintWriter writer = response.getWriter();
Random rand = new Random();
// 死循环 查询有无数据变化
while (true) {
Thread.sleep(300); // 休眠300毫秒,模拟处理业务等
int i = rand.nextInt(100); // 产生一个0-100之间的随机数
if (i > 20 && i < 56) { // 如果随机数在20-56之间就视为有效数据,模拟数据发生变化
long responseTime = System.currentTimeMillis();
// 返回数据信息,请求时间、返回数据时间、耗时
writer.print("result: " + i + ", response time: " + responseTime + ", request time: " + timed + ", use time: " + (responseTime - timed));
break; // 跳出循环,返回数据
} else { // 模拟没有数据变化,将休眠 hold住连接
Thread.sleep(1300);
服务器端实现,这里就模拟下程序监控数据的变化。上面代码属于SpringMVC 中controller中的一个方法,相当于Servlet中的一个doPost/doGet方法。如果没有程序环境适应servlet即可,将方法体中的代码copy到servlet的doGet/doPost中即可。
服务器端在进行长连接的程序设计时,要注意以下几点:  1. 服务器程序对轮询的可控性  由于轮询是用死循环的方式实现的,所以在算法上要保证程序对何时退出循环有完全的控制能力,避免进入死循环而耗尽服务器资源。 2. 合理选择“心跳”频率  从图1可以看出,长连接必须由客户端不停地进行请求来维持,所以在客户端和服务器间保持正常的“心跳”至为关键,参数POLLING_LIFE应小于WEB服务器的超时时间,一般建议在10~20秒左右。 3. 网络因素的影响  在实际应用时,从服务器做出应答,到下一次循环的建立,是有时间延迟的,延迟时间的长短受网络传输等多种因素影响,在这段时间内,长连接处于暂时断开的空档,如果恰好有数据在这段时间内发生变动,服务器是无法立即进行推送的,所以,在算法设计上要注意解决由于延迟可能造成的数据丢失问题。 4. 服务器的性能  在长连接应用中,服务器与每个客户端实例都保持一个持久的连接,这将消耗大量服务器资源,特别是在一些大型应用系统中更是如此,大量并发的长连接有可能导致新的请求被阻塞甚至系统崩溃,所以,在进行程序设计时应特别注意算法的优化和改进,必要时还需要考虑服务器的负载均衡和集群技术。
上图是返回的结果,可以看到先发出请求,不一定会最先返回结果。这样就不能保证顺序,造成脏数据或无用的连接请求。可见对服务器或网络的资源浪费。
2、普通轮询 iframe方式
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<%@ include file="/tags/jquery-lib.jsp"%>
<script type="text/javascript">
$(function () {
window.setInterval(function () {
$("#logs").append("[data: " + $($("#frame").get(0).contentDocument).find("body").text() + " ]
");
$("#frame").attr("src", "${pageContext.request.contextPath}/communication/user/ajax.mvc?timed=" + new Date().getTime());
// 延迟1秒再重新请求
window.setTimeout(function () {
window.frames["polling"].location.reload();
}, 1000);
}, 5000);
});
</script>
</head>
<body>
<iframe id="frame" name="polling" style="display: none;"></iframe>
<div id="logs"></div>
</body>
</html>
这里的客户端程序是利用隐藏的iframe向服务器端不停的拉取数据,将iframe获取后的数据填充到页面中即可。同ajax实现的基本原理一样,唯一不同的是当一个请求没有响应返回数据的情况下,下一个请求也将开始,这时候前面的请求将被停止。如果要使程序和上面的ajax请求一样也可以办到,那就是给每个请求分配一个独立的iframe即可。下面是返回的结果:
其中红色是没有成功返回请求就被停止(后面请求开始)掉的请求,黑色是成功返回数据的请求。
3、长连接iframe方式
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="author" content="hoojo & http://hoojo.cnblogs.com">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<%@ include file="/tags/jquery-lib.jsp"%>
<script type="text/javascript">
$(function () {
window.setInterval(function () {
var url = "${pageContext.request.contextPath}/communication/user/ajax.mvc?timed=" + new Date().getTime();
var $iframe = $('<iframe id="frame" name="polling" style="display: none;" src="' + url + '"></iframe>');
$("body").append($iframe);
$iframe.load(function () {
$("#logs").append("[data: " + $($iframe.get(0).contentDocument).find("body").text() + " ]
");
$iframe.remove();
});
}, 5000);
});
</script>
</head>
<body>
<div id="logs"></div>
</body>
</html>
这个轮询方式就是把刚才上面的稍微改下,每个请求都有自己独立的一个iframe,当这个iframe得到响应的数据后就把数据push到当前页面上。使用此方法已经类似于ajax的异步交互了,这种方法也是不能保证顺序的、比较耗费资源、而且总是有一个加载的条在地址栏或状态栏附件(当然要解决可以利用htmlfile,Google的攻城师们已经做到了,网上也有封装好的lib库),但客户端实现起来比较简单。
如果要保证有序,可以不使用setInterval,将创建iframe的方法放在load事件中即可,即使用递归方式。调整后的代码片段如下:
<script type="text/javascript">
$(function () {
(function iframePolling() {
var url = "${pageContext.request.contextPath}/communication/user/ajax.mvc?timed=" + new Date().getTime();
var $iframe = $('<iframe id="frame" name="polling" style="display: none;" src="' + url + '"></iframe>');
$("body").append($iframe);
$iframe.load(function () {
$("#logs").append("[data: " + $($iframe.get(0).contentDocument).find("body").text() + " ]
");
$iframe.remove();
// 递归
iframePolling();
});
})();
});
</script>
这种方式虽然保证了请求的顺序,但是它不会处理请求延时的错误或是说很长时间没有返回结果的请求,它会一直等到返回请求后才能创建下一个iframe请求,总会和服务器保持一个连接。和以上轮询比较,缺点就是消息不及时,但保证了请求的顺序。
4、ajax实现长连接
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<%@ include file="/tags/jquery-lib.jsp"%>
<script type="text/javascript">
$(function () {
(function longPolling() {
$.ajax({
url: "${pageContext.request.contextPath}/communication/user/ajax.mvc",
data: {"timed": new Date().getTime()},
dataType: "text",
timeout: 5000,
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#state").append("[state: " + textStatus + ", error: " + errorThrown + " ]
");
if (textStatus == "timeout") { // 请求超时
longPolling(); // 递归调用
// 其他错误,如网络错误等
} else {
longPolling();
},
success: function (data, textStatus) {
$("#state").append("[state: " + textStatus + ", data: { " + data + "} ]
");
if (textStatus == "success") { // 请求成功
longPolling();
});
})();
});
</script>
</head>
<body>
上面这段代码就是才有Ajax的方式完成长连接,主要优点就是和服务器始终保持一个连接。如果当前连接请求成功后,将更新数据并且继续创建一个新的连接和服务器保持联系。如果连接超时或发生异常,这个时候程序也会创建一个新连接继续请求。这样就大大节省了服务器和网络资源,提高了程序的性能,从而也保证了程序的顺序。
六、总结
现代的浏览器都支持跨域资源共享(Cross-Origin Resource Share,CORS)规范,该规范允许XHR执行跨域请求,因此基于脚本的和基于iframe的技术已成为了一种过时的需要。
把Comet做为反向Ajax的实现和使用的最好方式是通过XMLHttpRequest对象,该做法提供了一个真正的连接句柄和错误处理。当然你选择经由HTTP长轮询使用XMLHttpRequest对象(在服务器端挂起的一个简单的Ajax请求)的Comet模式,所有支持Ajax的浏览器也都支持该种做法。
基于HTTP的长连接技术,是目前在纯浏览器环境下进行即时交互类应用开发的理想选择,随着浏览器的快速发展,html5将为其提供更好的支持和更广泛的应用。在html5中有一个websocket 可以很友好的完成长连接这一技术,网上也有相关方面的资料,这里也就不再做过多介绍。
转载自: https://www.cnblogs.com/AloneSword/p/3517463.html 
哇偶哇偶Z
关注
关注
11
点赞
52
收藏
评论
基于HTTP的长轮询简单实现
Web客户端与服务器之间基于Ajax(http)的常用通信方式,分为短连接与长轮询。短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。在长轮询机制中,客户端像传统轮询一样从服务器请求数据。然而,如果服务器没有可以立即返回给客户端的数据,则不会立刻返回一个空结果,而是保持这个请求等待数据到来(或者恰当的超时:小于ajax的超时时间),之后将数据作为结果返回...
复制链接
扫一扫
专栏目录
http长轮询技术comet的实现
09-20
通过comet实现了一个聊天功能。
1.需要在tomcat的server.xml里面配置
2.需要在tomcat的context.xml里面配置
在Context标签里面配置:
基于HTTP的长轮询实现
You’re a wanderer just like me
08-10
1122
Web客户端与服务器之间基于Ajax(http)的常用通信方式,分为短连接与长轮询。
短连接:客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。
在长轮询机制中,客户端像传统轮询一样从服务器请求数据。然而,如果服务器没有可以立即返回给客户端的数据,则不会立刻返回一个空结果,
而是保持这个请求等待数据到来(或者恰当的超时:小于ajax的超时时间),之后将数据作为结果返回给客户端。
长轮询机制如下图所示:
web客户端代码如下:
//向后台长轮询消息
function long
评论 3
您还未登录,请先
登录
后发表或查看评论
【前端】HTTP轮询的简单实现
最新发布
weixin_44716527的博客
11-16
167
http轮询
HTTP长连接与短连接、长轮询与短轮询及长轮询的实现概述
aoselei6295的博客
06-10
328
HTTP长连接(long connection)与短连接(short connection)本质上是TCP长连接和短连接:短连接是指在一次HTTP请求和响应之后立即关闭本次TCP连接,下次请求响应重建一个新的TCP连接;而长连接是指请求响应之后并不立即关闭本次TCP连接,下次请求响应继续重用该TCP连接。HTTP/1.0默认短连接,HTTP/1.1起默认长连接,长连接通过...
轮询,长连接,长轮询原理及实现方式,优缺点
哈哈哈
02-28
8116
轮询,长连接,长轮询原理及实现方式,优缺点
在前一篇文章中我们了解了webSocket,就很有必要了解一点web通信技术。常用的轮询,长连接原理及实现方法。
通常的web应用的交互过程是:客户端发送请求,服务端接收和审核完成请求后进行处理并返回结果给客户端,然后客户端将信息呈现出来。这种机制在处理一些简单信息传递,不频繁的应用中比较常用。但对于一些实时传递要求比较高的应用来说,比如...
轮询机制是什么意思(通俗理解轮询)
热门推荐
gongjin28_csdn的博客
09-08
3万+
按照某种规则进行顺序触发(表述不是太明确,望指正);
案例供思考
1、 一艘船漏水了,上面20个人,但是只有一个救生艇可供3人乘坐。于是20个人凑成一圈,每次数到第七个,就将他踢下去。请问最后哪三个人获得乘坐资格?(轮询规则是下一个是踢下去人往下数7)
2、代码案例
public static void main(String[] args) {
int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
// 轮询规则:指定起始索引位置
..
Web 通信 之 长连接、长轮询(long polling)
weixin_34406061的博客
09-26
1601
基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性。 一、什么是长连接、长轮询? 用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息。这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已...
ajax长连接没有反应,ajax实现服务器与浏览器长连接的功能
weixin_34690611的博客
08-05
76
有时候,需要服务器主动给浏览器推送数据,这里用ajax来实现这种功能,具体请看这里:var uid = "{$uid}";var i = 0;var timer;$().ready(function(){//打开扫码登录模态框$('#login').click(function(){//如果用户已经登录,则返回if(uid){return ;}//打开模态框,通过remote选项从远程加载数据$(...
java ajax长连接_ajax长连接实现web实时通讯
weixin_42628846的博客
03-04
237
搜索热词因web运行模式请求-响应,服务端无法主动发起通讯,所以实时性备受诟病,ajax轮询可以模拟及时通讯,但连接太频繁将给服务端带来很大压力,不频繁则实时性很差。本文介绍在web上真正实现实时通讯的方法,ajax长连接。特别说明:ajax长连接是浏览器兼容的简述过程:进入页面客户端即发起一个ajax请求,服务端收到请求后不立即返回,将其阻塞,待服务端有新信息时将信息返回给客户端,客户端回调函数...
一文详解 Http 短轮询、长轮询
Coding技术小馆
01-09
2515
早期的很多网站为具备数据推送能力,所在用的技术基本都是`HTTP轮询`。
轮询是由由客户端每隔一段时间(如每隔5s)向服务器发出HTTP请求,服务端接收到请求后向客户端返回最新的数据。客户端的轮询方式一般为`短轮询`或`长轮询`。...
长连接 Web
08-02
233
一、什么是长连接
HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;相反的就是短连接。
 HTTP首部的Connection: Keep-alive是HTTP1.0浏览器和服务器的实验性扩展,当前的HTTP1
http长轮询&短轮询
轻耘智科技CTO 尤胜荣 的专栏
10-09
94
http 协议介绍:
http 协议是请求/响应范式的, 每一个 http 响应都是由一个对应的 http 请求产生的; http 协议是无状态的, 多个 http 请求之间是没有关系的.
http 长连接:
目前 http 协议普遍使用的是 1.1 版本, 之前有个 1.0 版本, 两者之间的一个区别是 1.1 支持http 长连接, 或者叫持久连接.1.0 不支持 http 长连接, ...
HTTP协议中的短轮询、长轮询、长连接和短连接
"零点起航"的专栏
08-19
525
一、长连接和短链接
HTTP1.0协议不支持长连接,从HTTP1.1协议以后,连接默认都是长连接
HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP连接就结束了
之所以网络上说HTTP分为长连接和短连接,其实本质上是说的TCP连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才有真正的长连接和短连接这一说。
HTTP协议说到底是应用层的协议,而TCP才是真正的传输层协议,只有负责传输的这一层才需要建立连接。
为了能很好得明白,一个形象的例子就是,拿
Spring Boot实现长轮询和短轮询(Short Polling & Long Polling)长连接和短连接
jake_Aaron的博客
10-25
3685
个人感觉,长连接和短连接是错误的描述,应该是长轮询和短轮询。
长轮询是一个在过去被广泛使用的概念,正是这种技术让网络感觉像是实时的,我认为了解一点历史会帮助你更好地理解。
目录
互联网简史
Javascript 之后的时代
长轮询的诞生
短轮询技术
长轮询
长轮询技术的实现
长轮询控制器
保持轮询方法
长轮询控制器测试
结论
互联网简史
如果您足够大,那么您就会知道早期的网络非常无聊。我所说的无聊是指静态的,没有活动部件。
它只是在 HTTP 请求/响应模型下以单向方式
HTTP轮询模型
weixin_30361641的博客
08-26
261
HTTP轮询模型
长短轮询
http协议是一种client-server模型的应用层协议,这种c-s的模式虽然大多数情况都能满足需求,但是某些场景也需要服务端能够将一些信息实时的推送到客户端,即实现服务器向客户端推消息的功能。
比如:
配置管理中心服务端需要将更新的配置推送到client端
消息推送服务器需要将一些消息推送到Android、iOS客户...
实现一个简单的长轮询
m0_57042151的博客
09-12
486
现在各大中间件都使用了长轮询的数据交互方式,目前比较流行的例如Nacos的配置中心,RocketMQ Pull(拉模式)消息等,它们都是采用了长轮询方的式实现。还会造成推送数据的延迟,比如:每10s请求一次配置,如果在第11s时配置更新了,那么推送将会延迟9s,等待下一次请求;为了解决短轮询存在的问题,客户端发起长轮询,如果服务端的数据没有发生变更,会hold住请求,直到服务端的数据发生变化,或者等待一定时间超时才会返回。降低轮询的间隔,延迟降低,压力增加;增加轮询的间隔,压力降低,延迟增高。
浅谈长轮询及其封装实现
ZDLW5的博客
07-01
2004
长轮询是与服务器保持即时通信的最简单的方式,它不使用任何特定的协议,例如 WebSocket ,所以也不依赖于浏览器版本等外部条件的兼容性,它很容易实现,也无需引入其他依赖,在很多场景下可以作为即时通信的最简单实现方案和兜底兼容方案...............
LinkedIn的即时消息:在一台机器上支持几十万条长连接
weixin_33971977的博客
12-06
50
最近我们介绍了LinkedIn的即时通信,最后提到了分型指标和读回复。为了实现这些功能,我们需要有办法通过长连接来把数据从服务器端推送到手机或网页客户端,而不是许多当代应用所采取的标准的请求-响应模式。在这篇文章中会描述在我们收到了消息、分型指标和读回复之后,如何立刻把它们发往客户端。 内容会包含我们是如何使用Play框架和Akka Actor Model来管理长连接、由服务器主动发送事件的。我...
关于http的长轮询和短轮询
zhou_xing_23的博客
03-04
290
(1)长轮询:多个 http 请求共用一个 tcp 连接; 这样可以减少多次临近 http 请求导致 tcp 建立关闭所产生的时间消耗
http 长轮询是服务器收到请求后如果有数据, 立刻响应请求; 如果没有数据就会 hold 一段时间, 这段时间内如果有数据立刻响应请求; 如果时间到了还没有数据, 则响应 http 请求;浏览器受到 http 响应后立在发送一个同样 http 请求查询是否有数...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
哇偶哇偶Z
CSDN认证博客专家
CSDN认证企业博客
码龄11年
暂无认证
95
原创
6万+
周排名
180万+
总排名
31万+
访问
等级
3572
积分
55
粉丝
86
获赞
38
评论
375
收藏
私信
关注
热门文章
基于HTTP的长轮询简单实现
22563
React browserHistory.push()传参
19122
只能在微信浏览器打开的链接,如何查看源码
17410
bootstrap fileinput 初始化图片 删除回调等
17062
Bootstrap fileinput 删除回调事件处理
14786
分类专栏
运维
1篇
项目
2篇
JS基础
103篇
工具
26篇
JS框架应用
39篇
JS实例应用
3篇
最新评论
Vue中axios 表单POST提交
WFKMSX:
不标注vue版本号的一律水文
useCallback 和 useMemo 及区别
蟹黄汤包_:
主要区别是 React.useMemo 将调用 fn 函数并返回其结果,而 React.useCallback 将返回 fn 函数而不调用它。 终于有讲清楚的了
java+springboot+bootstrap-fileInput 文件上传前后台完整示例
sinat_29967497:
但是有两处报错啥原因呀。一个是 String versionGbk = AnalysisApk.unZip(tmpFile.getPath(), "")[0]; AnalysisApk报错,另一个是 path = UpyunUtils.uploadApk(tmpFile,这行,UpyunUtils这个报错
hooks非受控组件更新传入的 props
文639:
很棒的文章,收获满满滴,最近也在学习前端,可以加您的v吗,感谢博主
React browserHistory.push()传参
huangting9696:
谢谢 一看就懂了
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
docker入门
前端40+精选VSCode插件
闭包前端分享
2021年8篇
2020年21篇
2019年68篇
2018年104篇
2017年2篇
目录
目录
分类专栏
运维
1篇
项目
2篇
JS基础
103篇
工具
26篇
JS框架应用
39篇
JS实例应用
3篇
目录
评论 3
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值