轮询技术

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中可以查看数据。

原文地址:https://www.cnblogs.com/bneglect/p/10424861.html