浏览器周期性的发出请求,如果服务器没有新数据需要发送就返回以空响应,这种方法问题很大,很快就被淘汰
var xhr = new XMLHttpRequest();
setInterval(function(){
xhr.open('GET','/data',true);
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
document.querySelector('#content').innerHTML = xhr.responseText;
}
}
xhr.send();
},1000);
长轮询是在打开一条连接以后保持连接,等待服务器推送来数据再关闭连接 然后浏览器再发出新的请求,这能更好地管理请求数量,也能及时得到更新后的数据
function send() {
var xhr = new XMLHttpRequest();
xhr.open('GET', '/data', true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
document.querySelector('#content').innerHTML = xhr.responseText;
send();
}
}
xhr.send();
}
send();
WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术
使用WebSocket,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道,两者之间就直接可以数据互相传送
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({port: 8080});
//监听客户端的请求
wss.on('connection', function (ws) {
//监听客户端的消息
ws.on('message', function(message) {
console.log('received: %s', message);
//向客户端发消息
ws.send('server hello');
});
});
var WebSocket = require('ws');
var ws = new WebSocket('ws://localhost:8080/');
ws.on('open', function open() {
ws.send('hello world!');
});
ws.on('message', function(data, flags) {
console.log(data);
console.log('message ',data);
});
//创建socket对象
var socket = new WebSocket('ws://localhost:8080/');
//监听连接事件
socket.onopen = function(){
//向服务器发送消息
socket.send('hello server');
}
//监听服务器端消息
socket.onmessage = function(event){
//输出服务器返回的消息
console.log(event.data);
}