如果你曾经开发过数据仪表盘或者运维监控大屏,那你肯定对这种痛点不陌生。你希望屏幕上显示的数字能实时反映服务器端的真实情况,但与此同时,你又不想写一个每秒都发请求的轮询循环,持续高频施压后端服务。
对于大量以更新为主的场景,更好的方法是服务器发送事件(SSE):一种基于标准HTTP的方法,允许服务器保持一个连接打开,并在事件发生时向客户端流式传输更新。RAD Studio 13.1最近在服务器和客户端都添加了对此的支持,因此我们构建了一个小型的概念验证,以展示端到端的实现效果。
SSE背后的想法很简单。客户端打开一个正常的HTTP连接并保持连接状态。服务器不像普通的网页那样发送响应并关闭连接,而是保持连接,并在发生值得报告的事情时将数据推送到用户的浏览器或应用程序。客户端在每个块到达时进行处理,并相应地更新用户界面。
SSE 在这种场景下大放异彩:服务器知道客户端需要查看的内容,而客户端的主要工作就是显示这些内容。实时指标、图形数据、作业进度、通知、日志尾部…… 对于这些任何一种情况,SSE 都是天然的解决方案,并且比完整的 WebSocket 设置更简单易行。
WebSockets在你需要在初始内容相同的频道上进行高频率的双向通信,或者你在构建具有复杂双向协议的系统时非常有用。但对于服务器到客户端的更新,SSE 通常是更干净、更优化的选择:
运行在普通的HTTP上,不需要特殊的协议。
每个浏览器内置重连接,使用RAD Studio时通过THTTPEventSource实现。
命名事件类型使客户端逻辑保持简单和明确。
让我们看看在RAD Studio 13.1中使SSE工作的所需代码。多亏了新的System.Net.HttpSse单元和WebBroker更新,实现起来非常简单。
要将标准的HTTP响应转换为流式SSE连接,您需要使用TWebResponseStream.BeginEventsStream来升级响应。从那时起,只要客户端保持连接,您只需在循环中写入您的事件。

在客户端,您使用新的THTTPEventSource。它在后台处理HTTP连接并排队接收事件。您的工作只是从队列中取出并读取数据。

既然你已经看到了基础的机制,让我们来看看我们如何在此基础上扩展到一个更高级的系统,具有自定义时间、后台线程和多个事件通道。

详细内容请参考:Server-Sent Events (SSE): Getting Real-Time Updates in Your Apps