Skip to content
☆´∀`☆
On this page

在线咨询实现方案

短轮询

通过定时器,每隔一段时间发起请求。

优点

  • 兼容性高,实现简单。

缺点

  • 延迟性高,请求中有大半是无用,非常消耗带宽和服务器资源,影响性能。

应用场景

  • 二维码扫码确认,信息通知

comet(长轮询、长连接)

长轮循

客户端向服务器发送 Ajax 请求,服务器接到请求后 hold 住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

优点

  • 兼容性好,在无消息的情况下不会频繁的请求,资源浪费较小。

缺点

  • 服务器 hold 连接会消耗资源,返回数据顺序无保证,难于管理维护

应用场景

  • webQQ、开心网、校内,Hi 网页版、Facebook IM 等等

长连接

在页面里嵌入一个隐蔵 iframe,将这个隐蔵 iframe 的 src 属性设为对一个长连接的请求或是采用 xhr 请求,服务器端就能源源不断地往客户端输入数据。 此方法已经过时,毕竟现在都已经放弃 iframe。

优点

  • 兼容性好,消息即时到达,不发无用请求

缺点

  • 服务器维护长连接消耗资源

应用场景

  • Gmail 聊天

SSE (Server-Sent Events)

SSE(Server-Sent Event,服务端推送事件)是一种允许服务端向客户端推送新数据的 HTML5 技术

优点

  • 基于 HTTP 而生,因此不需要太多改造就能使用,使用方便,而 websocket 非常复杂,必须借助成熟的库或框架

缺点

  • 基于文本传输效率没有 websocket 高,不是严格的双向通信,客户端向服务端发送请求无法复用之前的连接,需要重新发出独立的请求,并且不兼容 IE

Websocket

Websocket 是一个全新的、独立的协议,基于 TCP 协议,与 http 协议兼容、却不会融入 http 协议,仅仅作为 html5 的一部分,其作用就是在服务器和客户端之间建立实时的双向通信。

优点

  • 真正意义上的实时双向通信,性能好,低延迟

缺点

  • 独立与 http 的协议,因此需要额外的项目改造,使用复杂度高,必须引入成熟的库,无法兼容低版本浏览器

实现方式

浏览器为 HTTP 通信提供了 XMLHttpRequest 对象,同样的,也为 WebSocket 通信提供了一个通信操作接口:WebSocket。

javascript
var ws = new WebSocket("wss://echo.websocket.org");

// 当连接建立成功,触发 open 事件
ws.onopen = function (evt) {
  console.log("建立连接成功 ...");

  // 连接建立成功以后,就可以使用这个连接对象通信了
  // send 方法发送数据
  ws.send("Hello WebSockets!");
};

// 当接收到对方发送的消息的时候,触发 message 事件
// 我们可以通过回调函数的 evt.data 获取对方发送的数据内容
ws.onmessage = function (evt) {
  console.log("接收到消息: " + evt.data);

  // 当不需要通信的时候,可以手动的关闭连接
  // ws.close();
};

// 当连接断开的时候触发 close 事件
ws.onclose = function (evt) {
  console.log("连接已关闭.");
};