轮询,长连接,长轮询原理及实现方式,优缺点

轮询,长连接,长轮询原理及实现方式,优缺点

在前一篇文章中我们了解了webSocket,就很有必要了解一点web通信技术。常用的轮询,长连接原理及实现方法。

通常的web应用的交互过程是:客户端发送请求,服务端接收和审核完成请求后进行处理并返回结果给客户端,然后客户端将信息呈现出来。这种机制在处理一些简单信息传递,不频繁的应用中比较常用。但对于一些实时传递要求比较高的应用来说,比如在线游戏,在线证券,在线聊天,在线新闻播报等应用来说就显得力不从心,一来要处理实时信息,二来要在极短的时间内处理大量的数据。在webSocket之前,技术人员常采用的方法就是轮询(polling)和comet技术。comet技术就是轮询技术的改进,分为长轮询和流技术。

轮询

轮询的原理就是客户端以一定的时间间隔向服务端发出请求,频繁的请求保持客户端和服务端同步,这个技术最大的问题就是客户端发出请求和服务器端的更新并不是一致的。客户端以固定的频率想服务器发出请求,可能服务器端并没有更新,返回的是个空的信息,等服务器端更新的时候,有可能客户端并没有请求,而且只有最后一次请求才能获得最新数据,这样多次请求不仅浪费了资源,而且并不是实际上的实时更新。

推送,长连接

推送也叫做长连接。也就是客户端并不是隔一段时间请求一次,而是发起一次请求后就挂起,一直到服务端有更新的时候,服务器才会主动推送信息到客户端。如果没有更新信息,那就一直保持连接的状态,客户端不做多余的请求,服务器端也不做响应。 长轮询是对定时轮询的一种改进,目的是为了降低无效的网络传输。当服务器端没有数据更新的时候,连接会保持一段时间周期直到数据改变或时间过期。通过这种机制来减少无效的客户端和服务器之间的交互。

流技术

流技术就是在客户端的页面使用一个隐藏的窗口向服务端发出一个长连接的请求。服务器端接到这个请求后作出回应并不断更新链接状态以保持客户端和服务器端的连接不过期。通过这种机制可以将服务器端的信息源源不断的推向客户端。这种机制在用户体验上有一点问题,需要针对不同的浏览器设计不同的方案来改进用户体验。同时这种机制在高并发的情况下,对服务器端是一个极大的考验。 通过以上的理论:更通俗一点的解释就是: 我(客户端)想从一个叫“服务器”的人那里得到一个赚钱的消息,但我和他只能通过电话的方式联系(虽然电话通信和web通信不一样,这里打个比方)。

轮询:

我打算每隔5秒钟打一次电话,如果服务器端有了消息,就发送给我。如果没有,我就挂掉,服务器就不做声。但是如果服务器在第6秒有新消息了,我只能在下一个5秒才能获取到这个信息。有一定的延迟。 长连接:我一直打电话,并且不挂断,主要服务器有新消息了,就传递给我,如果没有,那就不做声。这种操作比较浪费资源,而且当如果有多个人找服务器,呈现在网络上,就是比较卡或速度慢。 长轮询:我一直打电话,并且设置了连接时间为20秒,如果20秒钟服务器有消息了,就传递给我,如果没有,那我就挂掉,再继续。这种方式也是一种资源的浪费。

各自的优缺点:

轮询

实现方式是使用定时器和ajax请求,以特定的时间间隔向服务器发送请求。

优点:后端开发人员编写比较容易;

缺点:不间断请求,请求中很大部分是无用的,浪费带宽;

应用:小型简单应用。

使用方法:

var xhr = new XMLHttpRequest();
    setInterval(function(){
        xhr.open('GET','/user');
        xhr.onreadystatechange = function(){
 
        };
        xhr.send();
    },1000

长连接:

使用ajax请求,发送ajax请求后,服务器会遇到阻塞,直到有消息传递才返回信息。

优点:无消息的时候不会频繁请求;

缺点:要处理高并发问题且消耗资源

应用:网页版qq,网页版应用等

使用方法:

function ajax(){
    var xhr = new XMLHttpRequest();
    xhr.open('GET','/user');
    xhr.onreadystatechange = function(){
          ajax();
    };
    xhr.send();
}

长连接

在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。 优点:消息及时到达,不发无用请求

缺点:浪费服务端资源

以上这些方案并不是真正意义上的实时信息传递。只是用ajax来模拟实时的效果。在每次客户端和服务器端交互的时候都一次HTTP请求和应答的过程,每次请求和应答都有完整的HTTP头信息,这就增加了每次传输的数据量。实际运用中,为了达到实时传输的效果,开发人员旺旺要构造两个http连接俩模拟客户端和服务器之间的双向通讯,一个连接用来处理客户端到服务端的数据传输,一个用来处理服务器到客户端的数据传输。这不可避免的增加了编程的难度。也增加了服务器端的负载。因此使用webSocket就可以实现实时信息通信


猜你喜欢

转载自blog.csdn.net/weixin_38384967/article/details/88844810