1.轮询:浏览器不断地向服务器返送ajax请求。配合使用定时函数 setInterval 或者 settimeout 定时发送ajax请求。
<script> setInterval(function(){ $.get('server.php',{id:5},function(data){ //根据服务器返回的数据进行下一步操作, }); },300); </script>
2.长轮询(comet):轮询是不断地发送ajax,而长轮询是浏览器发送一次ajax之后,服务器会去搜索数据(数据库等等),如果服务器没有搜索到数据,那么就不会响应客户端。在浏览器发送请求后到服务器返回给客户端数据这中间空白的时间,就是处于阻塞状态,阻塞状态持续到服务器做出响应。然后重复上述的过程,就是长轮询。
<script> function longLunXun(){ $.get('server.php',{id:3},function(data){ alert(data); longLunXun(); //递归来实现不断发送,没有结束,一直发。 }); //递归和定时函数不同的是,递归会在服务器作出响应后,才会再次发送ajax请求 } longLunXun(); //我觉得这行代码不需要,不过还没有测试,等测试过就知道了 </script>
服务器端处理:服务器端是需要有个死循环的,死循环里不断地查询数据。死循环后面就没必要写代码了,因为不可能执行。注意是死循环,不是循环。
3.sse : 和轮询有几分相似,SSE是客户端请求服务器后,服务器每隔一段时间向客户端发送数据(注意是单向的)。
4.socket:客户端和服务器端双向实时通信。
5.socket使用:安装依赖包:express、ejs、socket.io。(前两个是为了更好更方便使用socket.io)
(1)新建一个目录,打开命令行:
npm install express
npm install socket.io
npm install ejs
(2)安装好依赖包后,开始写代码
//引入express包 var express = require('express'); //create application var app = express(); //模板引擎引入 app.use(express.static('./static')); app.set('views','./views'); app.set('view engine','ejs'); var server = require('http').createServer(app); //创建socket服务 var io = require('socket.io')(server); //路由规则 app.get('/',function(req,res){ res.render('index'); }); io.on('connection',function(socket){ socket.on('message',function(data){ console.log(data); }); //on接收数据, message可以理解为通道名,发送和接收数据所走的通道 var i = 0; setInterval(function(){ socket.emit('message',i++); },2000); //emit发送数据,,定时发送 }) server.listen(8080);
(3)上面服务器端代码写好,接下来是客户端代码。首先需要创建一个文件。因为服务端代码设置的是views,所以创建一个views目录,里面创建一个ejs为后缀的文件。
<!DOCTYPE html> <html> <head> <title></title> </head> <body> //先引入socket文件 <script type="text/javascript" src="/socket.io/socket.io.js"></script> <script type="text/javascript"> var socket = io(); //接收 //message 通道名或者说是频道名 socket.on('message',function(data){ console.log(data); }); //sent var i = 100; setInterval(function(){ socket.emit('message',i++); },2000); </script> </body> </html>
(4)启动:在命令行输入node app.js启动。在firbug中可以查看数据。