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对象存储,能够实现实时推送。