server sent event

h5提出的server sent event支持服务端数据发生改变时向客户端发送数据,而不用使用ajax长轮询来请求数据。Server sent event技术有几个优点:①轻量,相对简单②单向传送数据③支持http协议④默认支持断线重连⑤自定义发送数据类型

来看个例子,首先新建一个see.html文件,然后创建一个EventSource对象,监听服务端发送的数据

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <span id='status'>Connection close</span>
    <br/>
    <span id="output"></span>
    <script>
      
        window.addEventListener('load',function(){
            var status=document.getElementById('status')
            var output=document.getElementById('output')

            var source;
         function connect(){
                source=new EventSource("stream")//向服务端建立连接
                
            //监听message事件,获取服务端发送的数据
                source.addEventListener('message',function(event){
                    output.textContent=event.data;
                },false)
                //监听open事件,判断连接是否进行中
                source.addEventListener('open',function(event){
                   status.textContent='连接打开'
                })
            //监听连接关闭
                source.addEventListener('error',function(event){
                    if(event.target.readyState==EventSource.CLOSED){
                        source.close()
                        status.textContent='连接关闭了'
                    }else{
                        status.textContent="连接关闭了,位置错误"
                    }
                })
            }
            if(!!window.EventSource){
            connect()
        }else{
            console.log('浏览器不支持')
        }
        },false)
    </script>
</body>
</html>

再在同级目录下新建一个index.js文件

var http=require('http')
var fs=require('fs')
http.createServer((req,res)=>{
    var index='./see.html'
    var filename;
    var interval;
    if(req.url==='/'){
        filename=index;
    }else{
        filename='.'+req.url;
    }
    if(filename==='./stream'){
    //设置响应头
        res.writeHead(200,{"Content-Type":'text/event-stream',
        'Catch-Control':'no-cache','Connection':'keep-alive'})
        res.write('retry:1000\n')//过1000秒重试
        res.write("data:"+new Date()+"\n\n")
        interval=setInterval(function(){
            res.write("data:"+new Date()+'\n\n')
        },1000)//每秒钟发送一次数据

        req.connection.addListener('close',function(){
            clearInterval(interval)
        },false)
    }else if(filename===index){
        fs.exists(filename,function(exists){
            if(exists){
            //读取see.html文件内容并展示在页面上
                fs.readFile(filename,function(error,content){
                    if(error){
                        res.writeHead(500)
                        res.end()
                    }else{
                        res.writeHead(200,{"Content-Type":"text/html"})
                        res.end(content,'utf-8')
                    }
                })
            }else{
                res.writeHead(404)
                res.end()
        
            }
        })
    }else{
        res.writeHead(404)
        res.end();
    }
}).listen(8000)

这样就实现了时间在see.html上不停的更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值