长轮询、WebSocket、服务器发送事件有什么区别

52次阅读
没有评论

共计 2840 个字符,预计需要花费 8 分钟才能阅读完成。

这篇文章主要介绍“长轮询、WebSocket、服务器发送事件有什么区别”的相关知识,丸趣 TV 小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“长轮询、WebSocket、服务器发送事件有什么区别”文章能帮助大家解决问题。

长轮询、WebSocket 和服务器发送事件有什么区别

长轮询,WebSocket 和服务器发送事件是客户端和服务器 (如 Web 浏览器和 Web 服务器) 之间流行的通信协议。首先,让我们了解标准 HTTP  Web 请求。以下是常规 HTTP 请求的一系列事件:

客户端打开连接并从服务器请求数据。

服务器计算响应。

服务器根据打开的请求将响应发送回客户端。

Ajax 轮询协议

轮询是绝大多数 AJAX 应用程序使用的一种标准技术。基本思想是客户端反复轮询 (或请求) 服务器以获取数据。客户端发出请求,并等待服务器响应数据。如果没有可用数据,则返回空响应。

客户端使用常规 HTTP 打开连接并从服务器请求数据。

所请求的网页以固定间隔将请求发送到服务器(例如 0.5 秒)。

服务器计算响应并将其发送回,就像常规 HTTP 流量一样。

客户端定期重复上述三个步骤,以从服务器获取更新。

轮询的问题在于客户端必须不断向服务器询问任何新数据。会照成许多空响应,从而造成 HTTP 开销。

HTTP 长轮询协议

这是传统轮询技术的一种变体,该技术允许服务器在数据可用时将信息推送到客户端。使用 Long-Polling,客户端可以像正常轮询一样从服务器请求信息,但是服务器可能不会立即响应。这就是为什么这种技术有时被称为“挂起请求”的原因。

如果服务器没有可供客户端使用的任何数据,则服务器将保留请求并等待直到某些数据可用为止,而不是发送空响应。

一旦数据可用,完整的响应将发送到客户端。然后,客户端立即从服务器重新请求信息,以便服务器几乎始终具有可用的等待请求,服务器可以使用该请求来响应事件。

使用 HTTP Long-Polling 的应用程序的基本生命周期如下:

客户端使用常规 HTTP 发出初始请求,然后等待响应。

服务器延迟其响应,直到有可用的更新或发生超时为止。

当有可用更新时,服务器会将完整的响应发送到客户端。

客户端通常会在收到响应后立即发送新的长轮询请求,或者在允许的等待时间的暂停后发送新的长轮询请求。

每个长轮询请求都有一个超时。由于超时而关闭连接后,客户端必须定期重新连接。

WebSockets 协议

WebSocket 提供全双工单个 TCP 连接上的通信通道。它提供了客户端和服务器之间的持久连接,双方都可以使用该连接随时开始发送数据。客户端通过称为 WebSocket 握手的过程建立 WebSocket 连接。如果该过程成功,则服务器和客户端可以随时在两个方向上交换数据。WebSocket 协议使客户端和服务器之间的通信具有较低的开销,从而促进了与服务器之间的实时数据传输。通过提供一种标准化的方法,使服务器无需客户端询问即可将内容发送到浏览器,并允许消息在保持连接打开的情况下来回传递。

服务器发送事件协议(SSEs)

在 SSEs 下,客户端与服务器建立持久的长期连接。服务器使用此连接将数据发送到客户端。如果客户端要向服务器发送数据,则需要使用另一种技术 / 协议。

客户端使用常规 HTTP 向服务器请求数据。

所请求的网页将打开与服务器的连接。

只要有新信息可用,服务器就会将数据发送到客户端。

当我们需要从服务器到客户端的实时流量,或者服务器正在循环生成数据并将向客户端发送多个事件时,SSEs 最好。

总结

常见的前后端消息通信协议如下:

传统的轮询协议

Http 长轮询协议

WebSockets 协议

SSEs 协议

SSEs 协议剖析

其中除了 SSEs 协议,其他方法大家都很熟悉了,再来看看 SSEs 到底是个啥?

SSE,即 Server-Sent Events,又叫 EventSource,是一种已被写入 HTML 5   标准的服务端事件推送技术,它允许客户端和服务端之间建立一个单向通道,以让服务端向客户端单方向持续推送事件消息,SSE   适用于不需要从客户端发送数据,但要通过某些服务器操作进行更新的场景,例如股票行情、共享设施更新、好友状态更新等。

上面已经简介过其大致流程了,简单说,所谓 SSE,就是浏览器向服务器发送一个 HTTP 请求,然后服务器不断单向地向浏览器推送“信息”(message)。这种信息在格式上很简单,就是“信息”加上前缀“data:  ”,然后以“\n\n”结尾。

SSE 与 WebSocket 有相似功能,都是用来建立浏览器与服务器之间的通信渠道。

两者的对比如下:

SSEWebsockethttp 协议,可以直接运行于现有的代理服务器和认证技术独立的 websocket 协议,需要服务器端支持 SSE 是单向通道,只能服务器向浏览器端发送。全双工通道,可以双向通信,功能更强轻量级,实现简单实现相对复杂默认支持断线重连需要自己实现心跳断线重连文本传输二进制传输支持自定义发送的消息类型无

客户端 DEMO

script type= text/javascript  if (!!window.EventSource) { var source = new EventSource( push  // 打开连接  source.addEventListener( open , function (evt) { // console.info( 连接已经打开了  }, false); // 接收消息  source.addEventListener(message , function (evt) { console.info(evt.data); }); // 错误消息, 及关闭通知  source.addEventListener(error , function (evt) { // console.info(evt); }, false); } else { alert( 浏览器不支持  SSE) }  /script

服务端 DEMO

首先向客户端声明接下来发送的是事件流 text/event-stream 类型的数据,然后就可以向客户端多次发送消息。事件流是一个简单的文本流,仅支持  UTF-8 格式的编码。每条消息以一个空行作为分隔符。

@RestController public class SSEsController { // 向浏览器发送数据  @RequestMapping(value =  /push , produces =  text/event-stream) public String push() throws InterruptedException { String msg = ...; // 固定格式  return  data:  + msg +  \n\n  } }

关于“长轮询、WebSocket、服务器发送事件有什么区别”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注丸趣 TV 行业资讯频道,丸趣 TV 小编每天都会为大家更新不同的知识点。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-03发表,共计2840字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)