HTTP 1.1消息协议和服务器发送的事件

时间:2015-10-21 17:36:30

标签: http server-sent-events

据我了解,在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而不喜欢Server Sent Events,我不希望在未加密的响应行中放入不必要的信息。

编辑:我的困惑来自忘记http 1.1浏览器会在需要时打开多个连接。因此,在我的简单设置中,浏览器只打开一个连接,将其转换为Server Sent Event连接,然后在具有不同客户端端口号的新连接上进行将来的请求。

1 个答案:

答案 0 :(得分:1)

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

是。

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

这不是请求。它是一个开放的HTTP连接。因此浏览器只接收打开的连接上的事件。

有意义吗?