使用服务器发送事件进行双向客户机-服务器通信(而不是WebSocket)的缺点

使用服务器发送事件进行双向客户机-服务器通信(而不是WebSocket)的缺点,websocket,real-time,server-push,server-sent-events,Websocket,Real Time,Server Push,Server Sent Events,最近,我发现服务器发送事件是WebSocket从服务器推送的一种更简单的替代方法。大多数比较它们的地方(比如,和)都说,如果客户机和服务器之间不需要全双工通信,那么WebSockets就太过分了,SSE就足够了 我的问题是,当您确实需要双向通信(例如聊天)时,使用SSE的缺点是什么,使用常规ajax请求从客户端发送消息,使用服务器流接收消息?考虑到我在服务器端使用SSE几乎不需要做任何配置,它似乎是一个更吸引人的选择。与小的WebSocket消息相比,Ajax请求是巨大的。标准HTTP请求(Aj

最近,我发现服务器发送事件是WebSocket从服务器推送的一种更简单的替代方法。大多数比较它们的地方(比如,和)都说,如果客户机和服务器之间不需要全双工通信,那么WebSockets就太过分了,SSE就足够了


我的问题是,当您确实需要双向通信(例如聊天)时,使用SSE的缺点是什么,使用常规ajax请求从客户端发送消息,使用服务器流接收消息?考虑到我在服务器端使用SSE几乎不需要做任何配置,它似乎是一个更吸引人的选择。

与小的WebSocket消息相比,Ajax请求是巨大的。标准HTTP请求(Ajax)包含很多头,包括每个请求的cookie,而WebSocket消息只有几个字节


HTTP(Ajax)请求的好处在于,如果缓存对您的问题有利,那么它们更容易缓存。

SSE优于WebSocket:

  • 不需要特殊的web服务器或web代理更改
  • 定义自定义事件(否则,客户端API基本相同)
  • 更容易集成现有的身份验证机制(OAuth、OpenID等)
SSE与WebSocket相比的缺点

  • 单向通信通道(服务器到客户端)。客户端到服务器需要一个单独的通道
  • 浏览器支持更为有限(没有本机IE支持,而IE 10支持WebSocket):
  • 依靠客户端验证来源(可能比WebSocket更容易受到XSS攻击)
  • 本机不支持二进制类型(WebSocket支持使用ArrayBuffers和Blob的原始帧)
  • 即使SSE端点不提供静态web内容,也需要一个成熟的web服务器(独立的WebSocket服务器可能相当简单)
  • 与使用WebSocket连接相比,使用AJAX进行双向通信的SSE将具有更高的往返延迟和更高的客户端->服务器带宽。这是由于每个客户机->服务器AJAX请求的连接设置开销造成的。此外,服务器->客户端延迟可能会在SSE中出现峰值,因为在许多配置中,长时间保持的连接最终将关闭(通常每30秒一次),并且需要重新打开,从而导致服务器->客户端延迟出现临时峰值
参考资料:


对于双向通信,能够缓存AJAX请求并没有什么帮助。如果您使用AJAX异步加载图像或其他静态数据,那么缓存将是有益的,但这是为了服务器->客户端通信,并且无助于客户端->服务器,而这正是AJAX在本场景中的用途。这是好的方面,但我不太同意独立服务器的复杂性。SSE协议非常简单——比WebSocket简单得多(无握手、成帧、屏蔽、二进制)。在这两种情况下,都需要解析HTTP(-like)头。您可以在bash脚本中实现SSE服务器:)@porneL,您是对的,基本SSE服务器的实现可能相当简单(尽管我希望看到您的bash版本),但基本WebSocket服务器也是如此。但不管怎样,我的观点并不是说WebSocket服务器更简单,而是SSE通常采用webserver,而WebSocket则不采用(尽管它的设计显然是为了方便地与现有的web基础设施集成)。@kanaka出于教育目的,你可以这样做:
while true;do{echo-e'HTTP/1.1 200 OK\r\n内容类型:文本/事件流\r\n\r\n数据:连接已建立并已关闭:);}netcat-l 55668;完成
了解苏格兰和南方能源公司层面的cors政策。您必须在前端运行的同一个域中代理此上游。SSE也不例外,我将根据我的个人经验补充一点:SSE相对于WebSocket的主要优势是SSE支持cookie头(在建立到API的数据连接之前,可以考虑基于令牌的授权)。这也意味着更快的第一次数据包传递(将令牌放入URL是不安全的,因此websokets需要在建立连接后将令牌发送到服务器)。WebSocket更容易受到DDOS攻击,因为所有的DDOS防御措施都应该由nodejs执行,而nodejs在这方面并不擅长。使用SSE,您可以依赖nginx。