简介 不知道大家有没有见过 Content-Type:text/event-stream 的请求头,这是 HTML5 中的 EventSource 是一项强大的 api,通过服务器推送实现实时通信。 与 websocket 相比,Event
不知道大家有没有见过 Content-Type:text/event-stream
的请求头,这是 HTML5
中的 EventSource
是一项强大的 api
,通过服务器推送实现实时通信。
与 websocket
相比,EventSource
提供了一种简单而可靠的单向通信机制(服务器->客户端),实现简单,适用于许多实时应用场景。
本文将介绍 EventSource
的简单使用、与 WEBSocket
的对比以及其优缺点,最后对其进行总结。
客户端从服务端订阅一条“流”,之后服务端可以发送消息给客户端直到服务端或者客户端关闭该“流”,所以 EventSource
也叫作 SSE(server-sent-event)
。
EventSource
是 html5
中的一项 API
,用于在客户端和服务器之间建立持久的、单向的通信连接。Http
协议,通过服务器推送的方式向客户端发送实时事件通知。示例:
服务器端使用 Go
创建了一个路由 /events
,当客户端通过 EventSource
对象连接到该路由时,服务器会不断地发送事件流(每隔2秒发送一个事件)。客户端的 HTML
页面中使用 javascript
创建了一个 EventSource
对象,通过 onmessage
事件,将接收到的事件数据添加到页面中。如果发生错误,客户端会关闭 EventSource
连接。
文件结构如下
程序目录- main.go- c1.html
package mainimport ("fmt""gopkg.in/antage/eventsource.v1""log""net/http""time")func main() {es := eventsource.New(nil, nil)defer es.Close()http.Handle("/", http.FileServer(http.Dir("./")))http.Handle("/events", es)go func() {for {// 每2秒发送一条当前时间消息,并打印对应客户端数量es.SendEventMessage(fmt.Sprintf("hello, now is: %s", time.Now()), "", "")log.Printf("Hello has been sent (consumers: %d)", es.ConsumersCount())time.Sleep(2 * time.Second)}}()log.Println("Open URL http://localhost:8080/ in your browser.")err := http.ListenAndServe(":8080", nil)if err != nil {log.Fatal(err)}}
SSE test SSE test
服务启动后访问 http://localhost:8080/c1.html 可见如下页面
EventSource
使用简单,基于标准的 HTTP
协议,无需复杂的握手过程。EventSource
具有内置的重连机制,确保连接中断后自动重新连接。EventSource
使用长轮询机制,消耗的资源相对较少,适合低带宽环境。EventSource
允许在跨域环境下进行通信,通过适当的响应头授权来自不同域的客户端连接。EventSource
只支持服务器向客户端的单向通信,无法实现客户端向服务器的实时交互。EventSource
,但在一些较旧的浏览器中可能不完全支持。WebSocket
支持全双工通信,客户端和服务器可以在同一连接上进行双向数据交换。WebSocket
具有低延迟和高效性能,适用于需要快速、实时响应的应用。EventSource
是 HTML5
中一个强大的 API
,提供了简单可靠的服务器推送机制,用于实现实时通信。
与 WebSocket
相比,EventSource
的优势在于其简单易用、自动重连、轻量级和跨域支持。然而,它也有一些限制,如单向通信和较低的浏览器支持。相比之下,WebSocket
适用于双向通信、大规模应用和实时性要求较高的场景,但其复杂性和穿越防火墙的挑战也需要考虑。
总的来说,EventSource
是一种非常有用的 API
,适用于许多实时应用场景,如实时股票报价、即时聊天、实时通知等。它提供了一种简单而可靠的方式来建立服务器推送连接,并实现实时更新和通知。如果应用程序只需要服务器向客户端单向推送数据,EventSource
是一个不错的选择。然而,如果需要双向通信或更高级的实时功能,WebSocket
可能更适合。
来源地址:https://blog.csdn.net/DisMisPres/article/details/130539861
--结束END--
本文标题: 实时通信的服务器推送机制 EventSource(SSE) 简介,附 go 实现示例
本文链接: https://lsjlt.com/news/375404.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0