SSE(服务器发送的事件)为什么以及如何是单向的
Why and how SSE (Server-Sent Events) are unidirectional
https://developer.mozilla.org/en-US/docs/Web/API/EventSource
The EventSource interface is web content's interface to server-sent events. An EventSource instance opens a persistent connection to an HTTP server, which sends events in text/event-stream format. The connection remains open until closed by calling EventSource.close().
根据我的理解,服务器发送的事件需要 persistent HTTP connection (Connection: keep-alive
) 与保持连接活动非常相似,就像在网络套接字的情况下一样。
如果连接是持久的,为什么服务器发送的事件是单向的? Web 套接字连接也是持久的。
在这种情况下,如果我向我的 HTTP 服务发送请求并且由于 EventSource
而打开了持久连接,会发生什么情况?它会重新使用 EventSource
打开的 HTTP 连接还是打开一个新连接?
如果它重新使用 EventSource
打开的连接,它如何被认为是单向的?
可能是微不足道的,但我不得不问,因为它不清楚。因为没有提到当 EventSource
.
打开现有连接时后续 HTTP 请求会发生什么
例如,我觉得可以使用 SSE 实现集中式聊天应用程序:
用户 1 向用户 2 发送消息(通过将其发送到 HTTP 服务器)。服务器通过新消息向用户 2 发送事件,用户 2 通过用户 1 的消息向 HTTP 服务器发送另一个请求,服务器向用户 1 发送事件。
为什么不认为是双向的?
相关:
SSE是单向的,因为当你打开一个SSE连接时,只有服务器可以向客户端(浏览器等)发送数据。客户端无法发送任何数据。 SSE 比 WebSockets 稍老,因此可能是这两种技术之间单向和双向支持之间的区别。
在您的用例中,如果您打开 SSE 连接(这是一个 HTTP 连接),则只有服务器能够发送数据。如果您希望向您的 HTTP 服务发送请求,您将需要打开一个新的 "classical" HTTP 连接。您将看到浏览器打开两个 HTTP 连接:1 个用于 SSE 连接,1 个用于经典 HTTP 请求(短期)。
您可以实现与SSE 的聊天。您可以使用 SSE 连接(因此是 HTTP)让用户从服务器接收消息。并且您可以使用 POST HTTP 请求使用户能够发送 his/her 消息。
请注意,大多数浏览器可以打开大约 6 个 HTTP/1.x 到同一主机的连接。因此,如果您使用 1 个 SSE 连接,它可能会保留 5 个 HTTP/1.x 连接。这仅适用于 HTTP/1.x。使用 HTTP 2.x,到同一主机的连接是多路复用的:因此,理论上,您可以发送尽可能多的 HTTP 请求您可以根据需要同时打开任意数量的 SSE 连接,从而突破 6 个连接的限制。
您可以查看这篇文章 (https://streamdata.io/blog/push-sse-vs-websockets/) and this video (https://www.youtube.com/watch?v=NDDp7BiSad4) 以深入了解这项技术以及它是否适合您的需求。他们总结了 SSE 和 WebSockets 的优缺点。
https://developer.mozilla.org/en-US/docs/Web/API/EventSource
The EventSource interface is web content's interface to server-sent events. An EventSource instance opens a persistent connection to an HTTP server, which sends events in text/event-stream format. The connection remains open until closed by calling EventSource.close().
根据我的理解,服务器发送的事件需要 persistent HTTP connection (Connection: keep-alive
) 与保持连接活动非常相似,就像在网络套接字的情况下一样。
如果连接是持久的,为什么服务器发送的事件是单向的? Web 套接字连接也是持久的。
在这种情况下,如果我向我的 HTTP 服务发送请求并且由于 EventSource
而打开了持久连接,会发生什么情况?它会重新使用 EventSource
打开的 HTTP 连接还是打开一个新连接?
如果它重新使用 EventSource
打开的连接,它如何被认为是单向的?
可能是微不足道的,但我不得不问,因为它不清楚。因为没有提到当 EventSource
.
例如,我觉得可以使用 SSE 实现集中式聊天应用程序:
用户 1 向用户 2 发送消息(通过将其发送到 HTTP 服务器)。服务器通过新消息向用户 2 发送事件,用户 2 通过用户 1 的消息向 HTTP 服务器发送另一个请求,服务器向用户 1 发送事件。
为什么不认为是双向的?
相关:
SSE是单向的,因为当你打开一个SSE连接时,只有服务器可以向客户端(浏览器等)发送数据。客户端无法发送任何数据。 SSE 比 WebSockets 稍老,因此可能是这两种技术之间单向和双向支持之间的区别。
在您的用例中,如果您打开 SSE 连接(这是一个 HTTP 连接),则只有服务器能够发送数据。如果您希望向您的 HTTP 服务发送请求,您将需要打开一个新的 "classical" HTTP 连接。您将看到浏览器打开两个 HTTP 连接:1 个用于 SSE 连接,1 个用于经典 HTTP 请求(短期)。
您可以实现与SSE 的聊天。您可以使用 SSE 连接(因此是 HTTP)让用户从服务器接收消息。并且您可以使用 POST HTTP 请求使用户能够发送 his/her 消息。
请注意,大多数浏览器可以打开大约 6 个 HTTP/1.x 到同一主机的连接。因此,如果您使用 1 个 SSE 连接,它可能会保留 5 个 HTTP/1.x 连接。这仅适用于 HTTP/1.x。使用 HTTP 2.x,到同一主机的连接是多路复用的:因此,理论上,您可以发送尽可能多的 HTTP 请求您可以根据需要同时打开任意数量的 SSE 连接,从而突破 6 个连接的限制。
您可以查看这篇文章 (https://streamdata.io/blog/push-sse-vs-websockets/) and this video (https://www.youtube.com/watch?v=NDDp7BiSad4) 以深入了解这项技术以及它是否适合您的需求。他们总结了 SSE 和 WebSockets 的优缺点。