通过SSE(Server-Send Event)实现服务器主动向浏览器端推送消息

摘要:
如果{}在使用SSE时,浏览器首先生成一个EventSource实例以启动与服务器的连接。varsource=newEventSource;ReadyState属性EventSource实例的ReadyState属性表示连接的当前状态。LastEventId:服务器发送的数据的编号。来源oneror=函数{};或来源。addEventListener;7.默认情况下,服务器发送的数据总是触发浏览器EventSource实例的消息事件。

一、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

免责声明:文章转载自《通过SSE(Server-Send Event)实现服务器主动向浏览器端推送消息》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇pandas数据框,统计某列或者某行数据元素的个数iframe+postMessage不同源页面通信下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python学习之路:红绿灯例子

importtime,threading event =threading.Event() deflighter(): count =0 event.set() whileTrue: if count > 5 and count < 10:#改成红灯 event.clear()...

JavaScript实战(带收放动画效果的导航菜单)

虽然有很多插件可用,但为了共同提高,我做了一系列JavaScript实战系列的实例,分享给大家,前辈们若有好的建议,请务必指出,免得误人子弟啊! ( 原创文章,转摘请注明:苏福:http://www.cnblogs.com/susufufu/p/5768402.html ) 今天是第一战:带收放动画效果的菜单,效果如下图:(样式有点丑(-^-)) ( 由于...

Electron进程间通信

在说Electron进程通信的时候,先说一下Electron中的两种进程:主进程和渲染进程。 主进程通过创建 BrowserWindow 实例来创建网页。 每一个 BrowserWindow 实例在其渲染过程中运行网页,当一个BrowserWindow 实例被销毁时,对应的渲染过程也会被终止。简单来说,一个客户端就是一个主进程。 渲染进程只能管理相应的网页...

git使用说明

初次使用请参考百度,google,博客园。这里也有一篇入门指南,简练精彩:http://www.kechuandai.net/git%E4%BD%BF%E7%94%A8%E5%B0%8F%E8%AE%B0/ 我把自己碰到的问题记录下,备忘。 1 修改文件并提交到github [luwenwei@dev01v ~/git/helww/labs]$ vim R...

Web Worker

写在前面 众所周知,JavaScript是单线程的,JS和UI更新共享同一个进程的部分原因是它们之间互访频繁,但由于共享同一个进程也就会造成js代码在运行的时候用户点击界面元素而没有任何响应这样的情况,这么糟糕的用户体验HTML5怎么会不修订了,这样Web Worker诞生了。 简介 Web Worker进程加载的js运行的时候不仅不会影响浏览器UI,而且...

火狐下window.event获取undefined问题

火狐下用window.event来进行相应操作时,会显示undefined,其他浏览器可以, 解决方法: 1,传入对象 $("a").on("click",function(e){var event = e || window.event}); 2,不传入对象 $("a").on("click",function(){var event = argumen...