【问题标题】:HTTP 1.1 message protocol and server sent eventsHTTP 1.1 消息协议和服务器发送事件
【发布时间】:2015-10-21 17:36:29
【问题描述】:

据我了解,在 1.1 中,通常浏览器发出请求,服务器发出单个消息响应。浏览器在收到对上一条消息的响应之前不会发出新的请求。因此,它收到的任何响应总是被解释为对最后一条消息的响应。 我的理解正确吗?

当我在 Firefox 中打开页面时,服务器应用程序会解析以下请求:

HGet / http/1.1
HeaderField(Host, localhost:8080)
HeaderField(User-Agent, Mozilla/5.0 (X11; Ubuntu; Linux x86_64;rv:41.0)     Gecko/20100101 Firefox/41.0)
HeaderField(Accept, text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8)
HeaderField(Accept-Language, en-GB,en;q=0.5)
HeaderField(Accept-Encoding, gzip, deflate)
HeaderField(Connection, keep-alive)

在响应页面后,通常会跟随 /favicon.ico 请求,并且事情会按预期进行。但现在我在我的 javascript 中插入了以下行以启用服务器发送事件:

var evtSource = new EventSource("/");

产生第二个请求:

HGet / http/1.1
HeaderField(Host, localhost:8080)
HeaderField(User-Agent, Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0)
HeaderField(Accept, text/event-stream)
HeaderField(Accept-Language, en-GB,en;q=0.5)
HeaderField(Accept-Encoding, gzip, deflate)
HeaderField(Referer, http://localhost:8080/)
HeaderField(Connection, keep-alive)
HeaderField(Pragma, no-cache)
HeaderField(Cache-Control, no-cache

那么我现在可以随时从服务器发送多条消息吗?(撇开超时问题不谈)如果是这样浏览器如何知道哪个请求,消息(来自服务器)是响应吗?它是否依赖于 contentType 标头字段?我应该在事件源中使用不同的 uri 吗?当我学习保持简单时,我没有使用加密,这阻止了我使用 HTTP 2。但后来我打算使用 https。我更喜欢对正常的 get 和 post 请求使用与服务器发送事件相同的 uri,因为我不想在未加密的响应行中放入不必要的信息。

编辑:我的困惑来自于忘记 http 1.1 浏览器会在需要时打开多个连接。因此,在我的简单设置中,浏览器只打开了一个连接,它将那个连接转换为服务器发送事件连接,然后在具有不同客户端端口号的新连接上发出未来请求。

【问题讨论】:

    标签: http server-sent-events


    【解决方案1】:

    那么我现在可以随时从服务器发送多条消息了吗?

    是的。

    浏览器如何知道对哪个请求,消息(来自服务器)是响应?

    这不是请求。这是一个开放的 HTTP 连接。所以浏览器只在它保持打开的打开连接上接收事件。

    有意义吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-04
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      相关资源
      最近更新 更多