在 Web 应用程序中,实时通信是一个广泛使用的功能。Server-Sent Events(SSE)是一个用于实现服务器到客户端的单向通信的标准协议,与 WebSockets 不同的是,它仅允许服务器发送消息到客户端。在本文中,我们将介绍如何在 Go 中使用 SSE 实现实时通信功能。
SSE 概述
SSE 是基于 HTTP 的协议,它允许服务器像发送 HTTP 响应一样发送多个事件。客户端通过 HTTP 请求的方式订阅这些事件,当这些事件被触发的时候,服务器会将相应信息发送给客户端。SSE 的实现相对简单,不需要像 WebSockets 一样,需要首先建立连接,而是通过指定事件类型、数据等信息,直接发送数据到客户端。
SSE 的消息格式如下:
event: message # 事件类型 data: Hello, world! # 数据
在 Go 中,我们可以使用 net/http
包来构建 SSE 服务器。
SSE 服务器的实现
下面是一个简单的 SSE 服务器的示例:
-- -------------------- ---- ------- ------- ---- ------ - ----- ---------- --------- ------ - --- - ------- - ------------- ------------ ---------- - --------- ---- ------- ----------- - --------- ---- ------- --------------- - --------- ------- - ---- ------ - -------------------- ------------- ----------------------------- ----------------- ----------------------------- ----------------- -- ------------- -- --- -- ---------------------------- ----- --- -- --- - ---------------- - - ---- -------------- -------------------- - -------------- - ----------------- -- ------------- - ---- ------------------ -------------------- - -------------- - ------------------------------ -------------------- ------------------------------- ----------- ---------------------------- ------------- ------ -- --------- ------- ---------- -- ------ ----- ------ - ----------- -- ------ --- ------ -- ------------------ --- - ------ - ---- --------- ------ ---- ----- -- --------- -------------- ------ -------- ------ -- --------- -- ---------------- -- --------- - --------- - - - - ---- ------------------ -------------------- - -------------- - --- -- ------------------------ -- --- -- -- - --------------- -- --- - ---------------- -- ---- ----------------------------- - ---- ------------- - --- - ------ - ---- --- -- ------------------ --- -- -- ----- ------- - -- -- --- - ---- -- -- ------------- ----------- - ---- ---- -- -- -------------- --------------- --- --------- - - -
这个示例中,我们定义了三个通道 clientJoin
, clientLeave
和 clientBroadcast
,它们用于管理客户端的连接和关闭,以及广播服务器发出的消息。我们设置了 SSE 的 HTTP 响应头信息,建立订阅通道,然后使用 notify() <-chan struct{}
来接收客户端的订阅请求。每个客户端订阅通道有自己的 events
通道来接收来自服务器的消息,这是一个无限循环的过程,直到客户端断开连接。
在服务器启动的时候,我们还要启动一个协程 broadcaster()
,它会在客户端发送消息时,循环遍历所有的订阅通道,并将新消息发送到这些通道中。
测试 SSE 服务器
运行上述示例程序后,我们可以通过访问 http://localhost:8080
来打开 SSE 客户端,使用 http://localhost:8080/broadcast?msg=<message>
来向所有客户端发送新的消息。
在客户端代码中,我们可以使用 JavaScript 来订阅服务器发送的消息:
const evtSource = new EventSource('/subscribe'); evtSource.onmessage = (event) => { console.log(event.data); }
现在,我们可以运行 SSE 服务器,并在客户端上订阅事件,然后可以轻松地使用 SSE 实现实时通信功能。
结论
本文中,我们介绍了如何在 Go 中使用 SSE 实现实时通信功能。我们讨论了 SSE 的基本原理,并提供了一个简单的示例程序,该程序可以运行一个 SSE 服务器,并向客户端发送实时消息。我们还讨论了如何测试 SSE 服务器,并提供了一个基本的客户端示例。实时通信是 Web 应用程序中常见的功能,SSE 是一种简单有效的实现机制,适合处理媒体流、实时数据和其他需要实时响应的应用场景。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67310d8eeedcc8a97c93a7eb