SSE(Server-Send Events)实践

html-css011

SSE(Server-Send Events)实践,第1张

HTTP 是客户端-服务器计算模型中的请求-响应协议。要开始交换,客户端向服务器提交请求。为了完成交换,服务器向客户端返回响应。服务器只能向一个客户端发送响应 (发出请求的那个) 。在 HTTP 协议中,客户端是消息交换的发起者。

服务器发送事件 (SSE) 是一种简单的技术,用于为特定的 Web 应用程序实现服务器到客户端的异步通信。

有多种技术允许客户端从服务器接收有关异步更新的消息。它们可以分为两类: 客户端拉取 服务器推送

在客户端拉取技术中,客户端会定期向服务器请求更新。服务器可以使用更新或尚未更新的特殊响应进行响应。有两种类型的客户端拉取:短轮询和长轮询。

客户端定期向服务器发送请求。如果服务器有更新,它会向客户端发送响应并关闭连接。如果服务器没有更新,它也会向客户端发送一个响应并关闭连接。

客户端向服务器发送请求。如果服务器有更新,它会向客户端发送响应并关闭连接。如果服务器没有更新,它会保持连接直到更新可用。当更新可用时,服务器向客户端发送响应并关闭连接。如果更新在某个超时时间内不可用,服务器会向客户端发送响应并关闭连接。

在服务器推送技术中,服务器在消息可用后立即主动向客户端发送消息。其中,有两种类型的服务器推送:SSE和 WebSocket。

SSE 是一种在基于浏览器的 Web 应用程序中仅从服务器向客户端发送文本消息的技术。SSE基于 HTTP 协议中的持久连接, 具有由 W3C 标准化的网络协议和 EventSource 客户端接口,作为 HTML5 标准套件的一部分。

WebSocket 是一种在 Web 应用程序中实现同时、双向、实时通信的技术。WebSocket 基于 HTTP 以外的协议(TCP),因此可能需要额外设置网络基础设施(代理服务器、NAT、防火墙等)。

客户端通过Http协议请求,在握手阶段升级为WebSocket协议。

在数据字段中,服务器可以发送事件数据

服务器可以发送唯一的事件标识符(id字段)。如果连接中断,客户端会 自动重新连接 并发送最后接收到的带有header的 Last-Event-ID 的事件 ID。

在重试字段中,服务器可以发送超时(以毫秒为单位),之后客户端应在连接中断时自动重新连接。如果未指定此字段,则标准应为 3000 毫秒。

如果一行以冒号字符 : 开头,客户端应该忽略它。这可用于从服务器发送评论或防止某些代理服务器因超时关闭连接。

要打开连接,应创建一个 EventSource 对象。

尽管 SSE 旨在将事件从服务器发送到客户端,但可以使用 GET 查询参数将数据从客户端传递到服务器。

要关闭连接,应调用方法 close()。

有表示连接状态的 readyState 属性:

客户端接收消息并处理他们,可以使用onmessage方法

SSE可被大多数浏览器支持:

Spring Web MVC 框架 5.2.0 是基于 Servlet 3.1 API 且用线程池实现异步应用程序. 所以应用能够被使用在 Servlet 3.1+ 的容器,比如:Tomcat 8.5 和 Jetty 9.3.

使用Spring MVC来发送事件:

示例:

在这个例子中,服务器每秒发送一个持续时间短的周期性事件流 - 一个有限的词流,直到词完成。

示例:

运行效果:

客户端示例(words.html):

运行效果:

在此示例中,服务器发送持久的周期性事件流 - 每秒可能无限的服务器性能信息流:

效果预览(每秒输出一次):

非周期性是指没有固定的时间周期,可能由其他因素在任意时刻都可能触发,下面示例通过spring event来模拟触发因子。

效果:

模拟触发动作:调用 http://localhost:8080/sse/mvc/trigger?eventType=customer

客户端收到数据:

Spring Web Flux 框架 5.2.0 是基于 Reactive Streams API 且使用event-loop计算模型来实现异步java应用程序。 此类应用程序可以在非阻塞 Web 服务器(例如 Netty 4.1 和 Undertow 1.4)和 Servlet 3.1+ 容器(例如 Tomcat 8.5 和 Jetty 9.3)上运行。

使用 Spring Web Flux 框架实现发送事件:

简单示例:

和上面spring mvc的示例一样,也是每秒输出数据,实现如下:

效果:

对比spring mvc的实现,我们改为flux实现,如下:

效果和上面是一样的,可以看出,reactive api是非常的简洁。

对webSocket到不是很熟悉,但是应该可以用其他方式解决,比如用vc开发一个ocx,放到客户端让浏览器调用,缺点是需要提前注册还必须用ie或360浏览器,也可以用flash开发一个socket客户端 ,让浏览器加载进去,flash任何浏览器都支持。

SSE3是英特尔去年推出Prescott核心处理器时出现的,包含13条指令,是对处理器SIMD能力的补充。处理器有时候会重复处理大量数据和类似操作,大量数据流通过处理器,需要进行的操作则是同一个(特别在音频/视频处理过程)。目前很多显卡核心上都带有SIMD处理单元,用来处理尽快处理大量的顶点、象素数据;CPU中的X87浮点处理部分中也具有这样的专门单元。

SSE3指令集中包括10条针对SIMD的新指令和3条不设计SSE寄存器的指令:

x87浮点-整数转换指令--fisttp;

复杂算术指令--addsubps, addsubpd, movsldup, movshdup, movddup;

视频编码指令--lddqu;

图形指令--haddps, hsubps, haddpd, hsubpd;

线程同步指令--monitor, mwait

上面给出的13条指令中,浮点-整数转换指令的功能很好理解,但不是所有的指令都这么显而易见。复杂算术指令增加了虚数功能,hadd和hsub指令则是为水平加、减操作准备的。这些指令可以加快顶点阵列中水平存储数据的处理速度。