当使用Server-Sent Events时,客户端应该建立多个连接来接收它感兴趣的不同事件,或者应该有单个连接,并且客户端通过单独的通道表明它感兴趣的是什么?海事组织后者似乎更可取,尽管对某些人来说可能会使客户端代码更加复杂。该规范支持命名事件(与特定主题相关的事件),这对我来说建议将Server-Sent Events连接用作所有事件的单个通道。每个应用程序应该只有一个EventSource对象吗?
下面的代码说明,其中多服务器发送的事件连接发起的第一个场景:
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会收到“标题2”的事件。虽然这是非常简单的,也有挂非常低效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会存在并且对特定事件的兴趣将通过具有服务器发送事件连接的单独请求来指定,并且注册由id参数关联。 topic3Listener会收到“topic3”事件,topic4Listener不会。虽然需要更多的代码,但好处是只能建立一个连接,但事件仍然可以被识别和处理。
网络上有很多示例显示使用命名事件,但似乎事件名称(或主题)事先已知,因此不需要客户端注册服务器的兴趣(example )。虽然我还没有看到一个显示多个EventSource对象的例子,但我也没有看到过一个例子,显示客户使用单独的请求来注册对特定主题的兴趣,正如我上面所做的。我对规范的解释使我相信,对某个主题(或事件名称)表示兴趣完全取决于开发人员,并且可以通过客户端知道要接收的事件的名称或动态地与客户端通知服务器它有兴趣接收特定事件。
我会很有兴趣听到别人对这个话题的想法。注:我通常是一个Java开发,所以请原谅我平庸的JS代码.. :)
您可能不会在事件流中使用所有事件名称,而是可以侦听“消息”事件并在event.data中编码topicId和其他信息 – 4esn0k 2012-07-27 17:34:26
是的,但这意味着我需要将这些数据编码在有效载荷中,这在消息识别已经成为规范数据框架的一部分时并不合理。 – 2012-07-31 01:44:09
+1!非常好的问题。你最终做了什么?我也在考虑采用第二种方法。如果你分享你是否遇到过任何问题,将不胜感激。 – brainOverflow 2013-06-07 16:51:27