SSE(Server-send Events) 服务器实时推送
Server-send Events(SSE):是一种基于Http协议轻量级服务器主动向客户端单向推送实时数据的技术,而WebSocket是基于WebSocket协议双向通信技术,工作原理是客户端通过发送一个特殊的 HTTP GET 请求到服务器,请求中包含 Accept: text/event-stream 头,表明客户端期望接收 SSE 数据流。
SSE响应流字段介绍:
event: <event_name>:可选字段,用于指定事件的名称,message是默认的事件名称。
data:必须字段,包含事件的数据内容,可以有多行,每行都以data:开头。
id:可选字段,提供一个唯一的标识符给事件,可用于断线重连和消息追踪。
retry:可选字段,指定客户端在连接断开后重连的间隔时间。
前端示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <!DOCTYPE html> <html lang= "en" > <head> <meta charset= "UTF-8" > <meta name= "viewport" content= "width=device-width, initial-scale=1.0" > <title>SSE Client</title> </head> <body> <ul id= "messages" ></ul> <script> const eventSource = new EventSource( 'http://localhost:80/rhxy/sse' ); eventSource.onmessage = function ( event ) { const messagesList = document.getElementById( 'messages' ); const newMessage = document.createElement( 'li' ); newMessage.textContent = `Received message: ${ event .data}`; messagesList.appendChild(newMessage); }; eventSource.onerror = function (error) { console.error( 'EventSource failed:' , error); }; </script> </body> </html> |
后端示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | @CrossOrigin @GetMapping(value = "/sse" , produces = MediaType.TEXT_EVENT_STREAM_VALUE) private void sendEvents(HttpServletResponse response) { response.setContentType( "text/event-stream" ); response.setCharacterEncoding( "UTF-8" ); response.setHeader( "Connection" , "keep-alive" ); response.setHeader( "Cache-Control" , "no-cache" ); for ( int i = 0; i < 20; i++) { try { response.getWriter().write( "id: " + i + "\n" ); response.getWriter().write( "event: message\n" ); response.getWriter().write( "retry: 10\n" ); response.getWriter().write( "data: 我是第" + i + "个\n\n" ); response.getWriter().flush(); Thread.sleep(1000); TimeUnit.SECONDS.sleep(1); } catch (Exception e) { e.printStackTrace(); } } |
效果图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-02-13 Elasticsearch 聚合Aggregations API