Server-SentEventsServer-SentEvents大多数时候,网页必须向服务器发送请求以接收新数据。服务器发送的事件可以将消息推送到网页。什么是SSE(Server-SentEvents)从本质上讲,SSE使用户能够订阅实时数据流。每当更新此数据流时,用户都可以实时看到新事件。如果您知道长轮询或WebSocket,那么您可能会认为SSE与Web-Socket没什么大不了的Websocket是服务器之间双向通信的一种形式。它经常被用来建立聊天室或多人视频游戏,因为这些应用场景需要服务器和客户端之间的持续通信。您可以将SSE视为一种单向websocket。只有服务器可以向订阅的客户端发送消息。在许多Web应用程序中,Web套接字可能有点矫枉过正。例如,一件商品的价格不需要双向沟通。服务器只需要单向通信来为其所有客户端更新价格。但是,在需要客户端和服务端进行强交互的场景下,WebSocket仍然是最好的选择。SSEvsLong-Polling长轮询是一种客户端周期性访问服务器以获取新数据的通信方式。适用于需要耗时计算或人工干预的响应SSE通常用于快速生成事件、即时更新的应用程序。虽然长轮训可以避免短轮训导致服务器过载,但是在服务端返回数据后,客户端仍然需要主动发起下一次长轮训请求,等待服务端响应。服务器到客户端,单向传输2.如果不使用HTTP/2,会受到最大打开连接数的限制。浏览器限制每个域名的http连接数为6,即跨标签。HTTP/2的默认值为100个接受消息的客户端浏览器EventSource实例将创建一个持久的HTTP连接,直到通过调用eventSource.close()关闭。constes=newEventSource('/v1/index/es')es.onopen=()=>{console.log('esopen')}es.onerror=(err)=>{console.log('err',err)}es.addEventListener('test',(res)=>{const{data}=resconsole.log('Messagefromtheserver:',data)})服务器需要使用文本发送消息并发送事件/事件流类型。每条消息都作为一个文本块发送,由一对换行符终止。1.格式每条接收到的消息都有以下字段的组合event一个字符串,标识描述的事件类型如果在浏览器上指定,将触发指定的监听器addEventListener()用于监听命名事件。onmessage处理未指定事件名称的消息。data消息的数据字段id事件id重试尝试发送事件时使用的重新连接时间必须是以毫秒为单位的整数codeconst{Readable}=require('stream')//写入数据constsend=(stream,事件,数据)=>{returnstream.push(`event:${event}\ndata:${JSON.stringify(data)}\n\n`)}router.all('/es',async(ctx)=>{//创建流constreader=newReadable()reader._read=function(data){console.log('>')}ctx.set({'Content-Type':'text/event-stream',//响应格式'Cache-Control':'no-cache','Connection':'keep-alive'})send(reader,'test',{data:111})ctx.body=readerletcount=1//模拟消息发送consttimer=setInterval(()=>{send(reader,'test',{data:111,count:count++})},3000)//处理连接断开ctx.req.on('close',()=>{console.log('close')clearInterval(timer)reader.destroy()})})代码仓库https://gitee.com/wjj0720/ser...http://ottfe.cn
