服务器序列事件(SSE)是一项技术,可以实时实时进行服务器与客户之间的单向通信。这是提供徒劳优势的Websocket的替代方法,例如较低的网络过载和较低的资源使用。在本教程中,我们将学习如何在GO中实现它并使用WebSocket进行。
它是什么?
这是基于HTTP的通信协议,允许服务器将事件发送给客户。客户刻在SSE流中,这是客户与服务器之间的持续连接。服务器将文本格式事件发送给客户,该事件能够实时处理。可以命名事件,有效载荷可以是文本格式或JSON。
如何实施?
以下示例显示了如何使用Golang实现此功能,但是不再可以关闭,因为它可以是其他任何东西,只需定义您将能够复制的正确标题即可。
后端(Golang)
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "index.html")
})
http.HandleFunc("/sse", func(w http.ResponseWriter, _ *http.Request) {
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
messageCounter := 0
for {
someMessage := fmt.Sprintf("Message: %v", messageCounter)
eventName := "event: myCustomEvent\n"
payloadMessage := fmt.Sprintf("data: %s\n\n", someMessage)
w.Write([]byte(eventName))
w.Write([]byte(payloadMessage))
time.Sleep(1 * time.Second)
w.(http.Flusher).Flush()
messageCounter++
}
})
http.ListenAndServe(":3333", nil)
}
/sse
路由定义了发送事件的必要头。 koud1头发定义为text/event-stream
,Cache-Control
被定义为no-cache
,以避免在缓存中存储,而Connection
则定义为keep-alive
,以保持开放的连接。然后,服务器启动一个无限循环以发送SSE事件。该事件是可选的,可用于指定发送的事件类型。有效载荷包含正在发送的数据。
使用
\n
的使用是强制性的,您可以看到我在设置事件名称和消息的有效负载时使用它。 SSE将能够解释何时在此线路休息后定义这些信息,最后,额外的\n
报告了此事件结束了。
解释后的结尾示例:
event: myCustomEvent
data: Message: 1
event: myCustomEvent
data: Message: 2
前端(HTML + JavaScript)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SSE</title>
</head>
<body>
<h1>SSE - Real Time Messages</h1>
<ul id="messages"></ul>
<script>
const eventSource = new EventSource('/sse');
eventSource.addEventListener('myCustomEvent', event => {
const messagesElement = document.getElementById('messages');
const li = document.createElement('li');
li.innerText = event.data;
messagesElement.appendChild(li);
console.log(event);
});
</script>
</body>
</html>
上面的代码非常简单,基本上我们将收到我们的后端发送的消息,让我们将它们添加到屏幕上,仅此而已。
koud9的实例,它接收了服务器正在收听(在这种情况下/sse )的端点URL。这建立了客户和服务器之间的持久连接,允许服务器向客户发送真实的时间更新。
然后将事件侦听器添加到服务器发送的Koud10自定义事件中。收到此事件后,将创建一个新的li
列表行,其中包含服务器发送的消息的文本。列表行被添加到带有koud13 ID的koud12元素中,这是消息在padga中显示的地方。
这一点的优点和缺点
这比Websocket具有徒劳的优势。首先是他是基于HTTP的,并使用HTTP门标准(80),这意味着他可以毫无问题地浏览防火墙和代理。此外,SSE所需的网络过载和服务器的功能要比Websocket少,因为只有服务器才能发送数据。这意味着服务器不需要处理如此多的输出连接,因此可以处理更多的输入连接。最后,SSE是基于HTTP的,并且使用相同的编程程序。
,它是幻想的。 但是,SSE也有一些缺点。首先是它得到了单向通信(来自客户服务器)的支持,这意味着客户无法将数据发送到服务器。此外,所有浏览器和平台都不支持这一点,这意味着您需要测试SSE是否在您想要支持的所有浏览器和平台上工作。比较SSE vs Websockets
尽管我们看起来像是相似的,但它们是一些重要的区别。主要区别是Websocket是双向的,这意味着客户和服务器都可以发送数据。这使Websocket更适合需要客户和服务器之间的双向交互的实时应用程序,例如在线游戏或聊天应用程序。另一方面,SSE更适合单向应用,例如概念或价格更新。
。 此外,Websocket使用的个性化通信协议以低于HTTP实现。这意味着Websocket能够支持高级资源,例如服务器端的通道多路复用,数据压缩和身份验证。另一方面,SSE被实施为HTTP资源,因此无法使用这些高级资源。