感受一下 Server-sent Events
突然想开坑写个浏览器端的小游戏,玩家操作之后的状态需要服务器通知给其他的玩家,第一反应用 WebSocket,不过发现 Server-sent Events 就足够了。
感受一下 Server-sent Events
Server-sent Events 允许服务端向浏览器端主动发送消息而不需要浏览器再次请求。原理上是服务端维持一个 Stream,MIME Type 是 text/event-stream
。
浏览器端需要通过 EventSource API,它先以 HTTP 请求连接到服务器,并维持连接状态,等待服务端的后续消息。
浏览器支持情况的话,IE 和 Edge 不支持,不过基于 Chromium 的 Edge 当然是没问题的,列表里的 Edge 版本号从 18 直接跳 75 很喜感 😄。
<picture>
<source srcset="caniuse.webp" type="image/webp" />
<img src="caniuse.png" alt="Server-sent Events 浏览器支持情况">
</picture>
<figcaption>
Server-sent Events 浏览器支持情况
</figcaption>
JavaScript 示意一下的话:
const src = new EventSource("/event")
src.AddEventListerer("eventName", function(ev) {
console.log(ev)
})
服务端在用 gin 的话是这个样子:
r.GET("/events", func(c *gin.Context) {
c.Stream(func(w io.Writer) bool {
c.SSEvent("eventName", gin.H{
"some": "data",
})
return false
})
})
<picture>
<source srcset="network.webp" type="image/webp" />
<img src="network.png" alt="Network">
</picture>
<figcaption>
Network
</figcaption>