为什么以及SSE(服务器发送的事件)是单向的

时间:2018-09-20 10:54:06

标签: http server-sent-events

https://developer.mozilla.org/en-US/docs/Web/API/EventSource

  

EventSource接口是Web内容到服务器发送的事件的接口。 EventSource实例打开与HTTP服务器的持久连接,该服务器以文本/事件流格式发送事件。连接保持打开状态,直到通过调用EventSource.close()关闭。

据我了解,服务器发送的事件需要persistent HTTP connection (Connection: keep-alive),就像保持连接正常一样,就像使用Web套接字一样。

如果连接是持久的,为什么服务器发送的事件是单向的? Web套接字连接也是持久的。

在这种情况下,如果我向HTTP服务发送请求并且由于EventSource而打开了持久连接,该怎么办。它会重新使用由EventSource打开的HTTP连接还是打开新连接?

如果重新使用由EventSource打开的连接,怎么认为是单向的?

可能微不足道,但是我不得不问,因为目前尚不清楚。因为当EventSource打开现有连接时,没有任何事情提及后续HTTP请求会发生什么。

例如,我似乎可以使用SSE来实现集中聊天应用程序:

用户1向用户2发送消息(通过将其发送到HTTP服务器)。服务器向用户2发送一条带有新消息的事件,用户2向HTTP服务器发送另一条请求,向用户1发送消息,服务器向用户1发送事件。

那怎么不算双向?

相关:

What's the behavioral difference between HTTP Stay-Alive and Websockets?

1 个答案:

答案 0 :(得分:1)

SSE是单向的,因为当您打开SSE连接时,只有服务器才能将数据发送到客户端(浏览器等)。客户端无法发送任何数据。 SSE比WebSockets早一点,因此这可能是这两种技术之间的单向和双向支持之间的区别。

在您的用例中,如果您打开SSE连接(这是HTTP连接),则只有服务器才能发送数据。如果您希望向HTTP服务发送请求,则需要打开一个新的``经典''HTTP连接。您将看到浏览器打开两个HTTP连接:1个用于SSE连接,另外1个用于经典HTTP请求(短时间)。

您可以与SSE进行聊天。您可以具有SSE连接(因此为HTTP),以使用户从服务器接收消息。您可以使用POST HTTP请求使用户能够发送他/她的消息。

请注意,大多数浏览器可以打开到同一主机的大约6个HTTP / 1.x连接。因此,如果您使用1个SSE连接,它将可能保持5个HTTP / 1.x连接。这仅适用于HTTP / 1.x。使用HTTP 2.x,到同一主机的连接是多路复用的:因此, 理论上 ,您可以根据需要同时发送多个HTTP请求。可以通过设置6个连接的限制来打开任意数量的SSE连接。

您可以查看本文(https://streamdata.io/blog/push-sse-vs-websockets/)和本视频(https://www.youtube.com/watch?v=NDDp7BiSad4),以深入了解该技术及其是否适合您的需求。他们总结了SSE和WebSockets的优缺点。