服务器范围事件(SSE)以及如何实施
#go #backend #realtime #sse

服务器序列事件(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-streamCache-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中显示的地方。

Front-end Preview

Front-end Network Tab

这一点的优点和缺点

这比Websocket具有徒劳的优势。首先是他是基于HTTP的,并使用HTTP门标准(80),这意味着他可以毫无问题地浏览防火墙和代理。此外,SSE所需的网络过载和服务器的功能要比Websocket少,因为只有服务器才能发送数据。这意味着服务器不需要处理如此多的输出连接,因此可以处理更多的输入连接。最后,SSE是基于HTTP的,并且使用相同的编程程序。

,它是幻想的。

但是,SSE也有一些缺点。首先是它得到了单向通信(来自客户服务器)的支持,这意味着客户无法将数据发送到服务器。此外,所有浏览器和平台都不支持这一点,这意味着您需要测试SSE是否在您想要支持的所有浏览器和平台上工作。

比较SSE vs Websockets

尽管我们看起来像是相似的,但它们是一些重要的区别。主要区别是Websocket是双向的,这意味着客户和服务器都可以发送数据。这使Websocket更适合需要客户和服务器之间的双向交互的实时应用程序,例如在线游戏或聊天应用程序。另一方面,SSE更适合单向应用,例如概念或价格更新。

。 此外,Websocket使用的个性化通信协议以低于HTTP实现。这意味着Websocket能够支持高级资源,例如服务器端的通道多路复用,数据压缩和身份验证。另一方面,SSE被实施为HTTP资源,因此无法使用这些高级资源。