Jam*_*ell 12 javascript html5 push http server-sent-events
当使用服务器发送事件时,客户端应该建立多个连接以接收它感兴趣的不同事件,或者是否应该有单个连接并且客户端通过单独的通道指示它感兴趣的内容?IMO后者似乎更为可取,尽管有些人可能会使客户端代码更复杂.规范支持命名事件(与特定主题相关的事件),对我来说,建议将Server-Sent Events连接用作所有事件的单个通道.
以下代码说明了启动多个服务器发送事件连接的第一个方案:
var EventSource eventSource1 = new EventSource("events/topic1");
eventSource1.addEventListener('topic1', topic1Listener, false);
var EventSource eventSource2 = new EventSource("events/topic2");
eventSource2.addEventListener('topic2', topic2Listener, false);
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
在此示例中,将存在单个EventSource,并且特定事件的兴趣将由具有服务器发送事件连接的单独请求指定,并且注册由id参数相关联.topic3Listener将收到"topic3"事件,而topic4Listener则不会.虽然需要稍多的代码,但好处是只进行一次连接,但事件仍然可以被识别和处理不同.
Web上有一些示例显示命名事件的使用,但似乎事先已知事件名称(或主题),因此客户端无需注册服务器(示例).虽然我还没有看到显示多个EventSource对象的示例,但我还没有看到一个示例显示客户端使用单独的请求来注册对特定主题的兴趣,正如我上面所做的那样.我对规范的解释使我相信,表明对某个主题(或事件名称)的兴趣完全取决于开发人员,并且可以通过客户知道它将要接收的事件的名称来静态地完成它.动态地与客户端警告服务器它有兴趣接收特定事件.
我很想听听别人对这个话题的看法.注意:我通常是Java开发人员,所以请原谅我平庸的JS代码.. :)
恕我直言,我强烈建议您EventSource为每个 SSE 提供服务拥有一个对象,然后使用不同类型发出消息。
但最终,这取决于消息类型的相似程度。例如,如果您有 5 种不同类型的与用户相关的消息,则有一个用户EventSource并通过事件类型进行区分。
如果您有一种关于用户的事件类型,另一种关于三明治的事件类型,我会说将它们保留在不同的服务中,因此EventSources。
将 EventSources 分解为与宁静服务相同的方式是一个好主意。如果您不能使用 AJAX 从同一个服务中获得两个东西,那么您可能不应该从同一个 EventSource 中获得它们。