zoukankan      html  css  js  c++  java
  • 通过SSE(Server-Send Event)实现服务器主动向浏览器端推送消息

    一、SSE介绍

    1.EventSource 对象

    SSE 的客户端 API 部署在EventSource对象上。下面的代码可以检测浏览器是否支持 SSE。

    if (‘EventSource’ in window) { 

    使用 SSE 时,浏览器首先生成一个EventSource实例,向服务器发起连接。

    var source = new EventSource(url); 

    上面的url可以与当前网址同域,也可以跨域。跨域时,可以指定第二个参数,打开withCredentials属性,表示是否一起发送 Cookie。

    var source = new EventSource(url, { withCredentials: true }); 

    readyState 属性 

    EventSource实例的readyState属性,表明连接的当前状态。该属性只读,可以取以下值。

    0:相当于常量EventSource.CONNECTING,表示连接还未建立,或者断线正在重连。 

    1:相当于常量EventSource.OPEN,表示连接已经建立,可以接受数据。 

    2:相当于常量EventSource.CLOSED,表示连接已断,且不会重连。 

    2.url 属性

    EventSource实例的url属性返回连接的网址,该属性只读。

    3.withCredentials 属性

    EventSource实例的withCredentials属性返回一个布尔值,表示当前实例是否开启 CORS 的withCredentials。该属性只读,默认是false。

    4.onopen 属性

    连接一旦建立,就会触发open事件,可以在onopen属性定义回调函数。

    source.onopen = function (event) { 

    };

    source.addEventListener(‘open’, function (event) { 

    }, false);

    5.onmessage 属性

    客户端收到服务器发来的数据,就会触发message事件,可以在onmessage属性定义回调函数。

    source.onmessage = function (event) { 

    var data = event.data; 

    var origin = event.origin; 

    var lastEventId = event.lastEventId; 

    };

    source.addEventListener(‘message’, function (event) { 

    var data = event.data; 

    var origin = event.origin; 

    var lastEventId = event.lastEventId; 

    }, false); 

    上面代码中,参数对象event有如下属性:

    data:服务器端传回的数据。 

    origin: 服务器 URL 的域名部分,即协议、域名和端口,表示消息的来源。 

    lastEventId:数据的编号,由服务器端发送。如果没有编号,这个属性为空。

    6.onerror 属性

    如果发生通信错误(比如连接中断),就会触发error事件,可以在onerror属性定义回调函数。

    source.onerror = function (event) { 

    };

    source.addEventListener(‘error’, function (event) { 

    // handle error event 

    }, false);

    7.自定义事件

    默认情况下,服务器发来的数据,总是触发浏览器EventSource实例的message事件。开发者还可以自定义 SSE 事件,这种情况下,发送回来的数据不会触发message事件。

    source.addEventListener(‘foo’, function (event) { 

    var data = event.data; 

    var origin = event.origin; 

    var lastEventId = event.lastEventId; 

    }, false); 

    8.close() 方法

    close方法用于关闭 SSE 连接。

    source.close();

    二、前端代码

    <!DOCTYPE html>
    <html>
    <head>
    <title>测试页面</title>
    <meta name="content-type" content="text/html; charset=UTF-8">
    <script type="text/javascript" src="../js/jquery-1.8.3.min.js"></script>
    <script type="text/javascript">
       // 检查浏览器是否支持SSE if ('EventSource' in window) { var source = new EventSource('../com/yh/myServlet/GetSession');
    source.onmessage
    = function(e) { console.log("message1:" + e.data); }; source.onopen = function(e) { console.log("连接打开."); }; source.onerror = function(e) { if (e.readyState == EventSource.CLOSED) { console.log("连接关闭"); } else { console.log("onerror:" + e.readyState); } }; } else { console.log("没有sse"); } </script> </head> <body> </body> </html>

    三、后端代码

    此处在servlet的doGet()方法中进行响应处理

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.setContentType("text/event-stream;charset=utf-8");
        PrintWriter writer = response.getWriter();
        Random r = new Random();
    //        try {
    //            Thread.sleep(5000);
    //        } catch (InterruptedException e) {
    //            e.printStackTrace();
    //        }
        // SSE返回数据格式是固定的以data:开头,以
    
    结束
        writer.print("data:第一段
    
    ");
    }

    部分转载自:http://www.ruanyifeng.com/blog/2017/05/server-sent_events.html

  • 相关阅读:
    lvs中dr模式配置脚本
    使用AFNetworking第三方下载类
    java 经常使用測试框架
    Qt5的插件机制(1)--Qt 框架中的插件载入机制概述
    leetcode笔记:Merge Sorted Array
    oracle仿全文检索切词机制实现文本信息类似度查找
    hadoop学习;datajoin;chain签名;combine()
    php函数in_array奇怪现象
    Sql_Server中怎样推断表中某列是否存在
    Java Bean 简单介绍及其应用
  • 原文地址:https://www.cnblogs.com/YeHuan/p/11335250.html
Copyright © 2011-2022 走看看