当使用服务器发送事件时,客户端应该建立多个连接来接收它感兴趣的不同事件,还是应该只有一个连接并且客户端通过单独的通道指示它感兴趣的内容?IMO 后者似乎更可取,尽管对某些人来说它可能会使客户端代码更复杂。该规范支持命名事件(与特定主题相关的事件),这对我来说建议服务器发送事件连接应该用作所有事件的单一通道。
以下代码说明了启动多个 Server-Sent Event 连接的第一种情况:
var EventSource eventSource1 = new EventSource("events/topic1");
eventSource1.addEventListener('topic1', topic1Listener, false);
var EventSource eventSource2 = new EventSource("events/topic2");
eventSource2.addEventListener('topic2', topic2Listener, false);
eventSource1 将接收“topic1”事件,而 eventSource2 将接收“topic2”事件。虽然这非常简单,但对于您感兴趣的每个主题都会发生挂起的 GET 也非常低效。
替代方法如下:
var EventSource eventSource3 = new EventSource("/events?id=1234")
eventSource3.addEventListener('topic3', topic3Listener, false);
eventSource3.addEventListener('topic4', topic4Listener, false);
var subscription = new XMLHttpRequest();
subscription.open("PUT", "/events/topic3?id=1234", true);
subscription.send();
在此示例中,将存在单个 EventSource,并且对特定事件的兴趣将由具有 Server-Sent Event 连接的单独请求指定,并且注册由 id 参数关联。topic3Listener 会收到“topic3”事件,而 topic4Listener 不会。虽然需要更多的代码,但好处是只建立了一个连接,但仍然可以以不同的方式识别和处理事件。
网络上有许多示例显示了命名事件的使用,但似乎事件名称(或主题)是预先知道的,因此客户端无需向服务器注册兴趣(示例)。虽然我还没有看到显示多个 EventSource 对象的示例,但我也没有看到显示客户端使用单独的请求来注册对特定主题的兴趣的示例,就像我在上面所做的那样。我对规范的解释使我相信,表明对某个主题(或事件名称)的兴趣完全取决于开发人员,并且可以在客户知道它将要接收的事件名称的情况下静态完成或客户端动态地提醒服务器它有兴趣接收特定事件。
我很想听听其他人对这个话题的看法。注意:我通常是 Java 开发人员,所以请原谅我平庸的 JS 代码.. :)