当前位置:编程学习 > JS >>

ajax轮询与websocket长链接区别和代码实例

WebSocket 的性能完全高于 Http,一次WebSocket连接其实就是一个Http请求,而轮询每一次都是Http请求。

况且现在的一些框架随随便便都可以做到百万级量。WebSocket 最核心的是服务端的被动性,因为对于Http请求而言,每一次都是一个request和response

而对于WebSocket可以是:“小弟,你有人给你发了条消息喔你收一下!”,而无须我隔一段时间向服务端问一下:“老头,有消息吗?,有消息的话你给我”;

要知道一次Http所带的信息很重(Cookie\Header etc)的好吧。

那么问题来了,你们后端不愿意做,只有一个原因:懒。轮询多简单呀,后端什么都不用改,WebSocket 我后端还要给你搭一个,要是.NET还好,几行代码也就搞定了。


HTTP协议的缺陷

在标准的HTTP请求响应语义中,浏览器发起请求,服务器发送一个响应,这意味着在浏览器发起新请求前,服务器不能发送新信息给客户端浏览器
ajax轮询
轮询:定时的通过Ajax查询服务端
缺点:消息的实时性较差
function sendXHR(obj) {  
    $.ajax({  
        type: "post", //AJAX请求类型  
        url: "http://www.zzzyk.com", 
        timeout: 1000 * 60,  //AJAX请求超时时间为60秒  
        data:obj,
        success: function (data) {  
            // 请求成功的回调函数 
        },
        error: function (data) {  
            // 请求失败的回调函数
        }
    });  
}
window.setInterval(sendXHR(obj),1000); // 实现轮询的重要代码
 
ajax长轮询
长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

优点:在无消息的情况下不会频繁的请求,比普通的轮询方式更及时

缺点:会消耗更多的服务器资源,且频繁访问服务器,可能ip会被拉进黑名单

function sendXHR() {  
    $.ajax({  
        type: "post", //AJAX请求类型  
        url: "http://www.yizuotu.net", 
        cache: false,  //无缓存  
        timeout: 1000 * 60,  //AJAX请求超时时间为60秒  
        data:{"key":"value"},
        success: function (data) {  
            // 请求成功的回调函数
            sendXHR();//请求后立即发起AJAX请求  
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {  
            // 请求失败的回调函数
            sendXHR()
        }
    });  
}  
 
'
运行运行
websocket
不管是长轮询还是短轮询,都不太适用于客户端数量太多的情况,因为每个服务器所能承载的TCP连接数是有上限的,这种轮询很容易把连接数顶满
采用 WebSocket 协议后,服务器可以主动推送消息给客户端;而不需要客户端以(长/短)轮询的方式发起http请求到server以获取数据更新反馈
WebSockct只需要一次HTTP 握手,整个通讯过程是建立在一次连接(状态)中的,server 端会一直推送消息更新反馈到客户端,直到客户端关闭请求,这样就无需 客户端为发送消息而建立不必要的 tcp 连接 和 为了建立tcp连接而发送不必要的冗余的连接上下文消息
兼容性不好,服务器需要另外配置,客户端实现简单,性能较轮询或长轮询更优,实时性极好
function WebSocketTest() {
        if ("WebSocket" in window) {
            alert("您的浏览器支持 WebSocket!");
            // 打开一个 web socket
            var ws = new WebSocket("ws://http://www.yizuotu.net/io");
            ws.onopen = function() {
                // Web Socket 已连接上,使用 send() 方法发送数据
                ws.send("发送数据");
                alert("数据发送中...");
            };
            ws.onmessage = function (event) {
                var received_msg = event.data;
                alert("数据已接收...");
            };
            ws.onclose = function() {
                // 关闭 websocket
                alert("连接已关闭...");
            };
        }
        else {
            // 浏览器不支持 WebSocket
            alert("您的浏览器不支持 WebSocket!");
        }
    }


1、ajax轮询 ,ajax轮询 的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。

2、long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。

直到有消息才返回或超时,返回完之后,客户端再次建立连接,周而复始,基于事件的触发,一个事件接一个事件。 


Ajax轮询与long poll都属于不断发送http请求,然后等待服务器处理,可以看到http协议一个特点,被动性,服务端不能主动联系客户端,只有客户端发起。
缺点:Ajax轮询需要服务器有很快的处理速度与快速响应。long poll需要很高的并发,体现在同时容纳请求的能力。

3、webSocket是html5一种新的协议,实现了浏览器与服务器之间的全双工通信,能很好的节省服务器资源与带宽,并在服务器端与浏览器端实现实时通行,他建立在TCP之上, 同http一样,通过tcp来传输数据。
只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,服务器端会知道连接的信息,知道客户端关闭请求,同时由服务器主动推送,当有信息需要发送时,直接发送。客户端的连接通过session对象存储,能够实现实时推送。
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,