websocket是HTML5中新出的协议
websocket是一个持久化的协议(相对于HTTP协议来说)。HTTP的生命周期是通过Request来界定,也就是说一个Request一个Response,在1.0中,这样的http请求就结束了。在Http1.1中进行了改进,使得有一个keep-alive。也就是说在一个http连接中,可以发送多个request,接收多个response。但是请记住,在Http中永远是 Request=Response
websocket只需要一次http握手,所以说整个通信过程是建立在一次连接/状态中。也就避免了Http的非状态性。服务端会一直知道你的请求信息,知道请求关闭。
websocket使用
var ws = new WebSocket(url)
ws.open()
ws.onmessage()
ws.onerror()
ws.onclose()
ajax轮询
1.短轮询
客户端通过定时器向服务端发送ajax请求
function getting(){
$.ajax({
type,
url,
success:function(){},
error:function(){}
})
}
setInterval(getting,2000)
2.长轮询
浏览器发送一个请求到服务器,服务器一直保持连接打开,直到有数据可以发送。发送完数据之后,浏览器关闭连接,随即再发送一条请求过去,以此循环下去
var getting = function(){
$.ajax({
type,
url,
success:function(res){
console.log(res)
getting()
},
error:function(err){
console.log(err)
getting()
}
})
}
getting()
轮询虽然也可以实现相同效果,但是比较耗费服务器端资源
websocket优点
- 支持推送,服务端可直接将数据发送到客户端而不用等待客户端发起请求
- 只要建立了连接,就会一直保持连接,直到请求关闭。也就避免了HTTP的非状态性,和HTTP相比,不但每次连接时候的总开销少了,而且websocket首部位置的信息量也少,通信量也小了。
- 减少了服务器端的资源小消耗(由于Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议)