Skip to content

即时通讯的实现:短轮询、长轮询、SSE 和 WebSocket 间的区别?

参考答案:

短轮询和长轮询的目的都是用于实现客户端和服务器端的一个即时通讯。

短轮询的基本思路是 浏览器每隔一段时间向浏览器发送 http 请求,服务器端在收到请求后,不论是否有数据更新,都直接进行响应。这种方式实现的即时通信,本质上还是浏览器发送请求,服务器接受请求的一个过程,通过让客户端不断的进行请求,使得客户端能够模拟实时地收到服务器端的数据的变化。这种方式的优点是比较简单,易于理解。缺点是这种方式由于需要不断的建立 http 连接,严重浪费了服务器端和客户端的资源。当用户增加时,服务器端的压力就会变大,这是很不合理的。

长轮询的基本思路是 首先由客户端向服务器发起请求,当服务器收到客户端发来的请求后,服务器端不会直接进行响应,而是先将这个请求挂起,然后判断服务器端数据是否有更新。如果有更新,则进行响应,如果一直没有数据,则到达一定的时间限制才返回。客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。长轮询和短轮询比起来,它的优点是明显减少了很多不必要的 http 请求次数,相比之下节约了资源。长轮询的缺点在于,连接挂起也会导致资源的浪费。

SSE 的基本思想是 服务器使用流信息向服务器推送信息。严格地说,http 协议无法做到服务器主动推送信息。但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息。也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。SSE 就是利用这种机制,使用流信息向浏览器推送信息。它基于 http 协议,目前除了 IE/Edge,其他浏览器都支持。它相对于前面两种方式来说,不需要建立过多的 http 请求,相比之下节约了资源。

WebSocket 是 HTML5 定义的一个新协议议,与传统的 http 协议不同,该协议允许由服务器主动的向客户端推送信息。使用 WebSocket 协议的缺点是在服务器端的配置比较复杂。WebSocket 是一个全双工的协议,也就是通信双方是平等的,可以相互发送消息,而 SSE 的方式是单向通信的,只能由服务器端向客户端推送信息,如果客户端需要发送信息就是属于下一个 http 请求了。

上面的四个通信协议,前三个都是基于HTTP协议的。 对于这四种即使通信协议,从性能的角度来看: WebSocket > 长连接(SEE) > 长轮询 > 短轮询 但是,我们如果考虑浏览器的兼容性问题,顺序就恰恰相反了: 短轮询 > 长轮询 > 长连接(SEE) > WebSocket 所以,还是要根据具体的使用场景来判断使用哪种方式。

题目要点:

短轮询和长轮询是客户端和服务器端进行即时通讯的两种方式,而SSE(Server-Sent Events)和WebSocket是HTML5引入的协议,用于实现服务器主动推送信息。

短轮询

  • 基本思路:客户端定期向服务器发送HTTP请求,服务器无论是否有数据更新都直接响应。
  • 优点:简单易理解。
  • 缺点:频繁的HTTP请求浪费资源,服务器压力大。

长轮询

  • 基本思路:客户端发起请求后,服务器先挂起请求,判断数据是否有更新。如果有更新则响应,否则在一定时间后返回。
  • 优点:减少不必要的HTTP请求次数。
  • 缺点:连接挂起也浪费资源。

SSE(Server-Sent Events)

  • 基本思想:服务器使用流信息向客户端推送信息,基于HTTP协议,客户端不会关闭连接,持续等待服务器推送的新数据。
  • 优点:不需要建立过多HTTP请求。
  • 缺点:浏览器兼容性有限,目前IE/Edge不支持。

WebSocket

  • 基本思想:服务器可以主动向客户端推送信息,全双工通信,通信双方可以相互发送消息。
  • 优点:高性能,资源利用率高。
  • 缺点:服务器端配置复杂。

性能上,WebSocket > SSE > 长轮询 > 短轮询。但考虑到浏览器兼容性,顺序可能相反。选择哪种通信方式取决于具体的使用场景和需求。