【发布时间】: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 浏览器会在需要时打开多个连接。因此,在我的简单设置中,浏览器只打开了一个连接,它将那个连接转换为服务器发送事件连接,然后在具有不同客户端端口号的新连接上发出未来请求。
【问题讨论】: