Server-sent Events 与 Ajax 实时通信的实现方法分享

随着互联网的发展,实时通信变得越来越重要,前端开发人员需要掌握各种方法来实现实时通信,其中 Server-sent Events 和 Ajax 是两种常用的技术。

Server-sent Events

Server-sent Events(简称 SSE)是一种浏览器与服务器之间的单向通信方式,它允许服务器向客户端推送数据,而不需要客户端不断地向服务器发起请求。SSE 使用了标准的 HTTP 协议,属于 HTML5 API 的一部分。SSE 可以被用来实现服务器向客户端的实时通信,对于在线游戏、聊天室等实时交互性高的应用非常有用。

SSE 的优点

  • 实时性:能够在服务器端数据发生变化的同时,实时地将数据推送到浏览器端。
  • 简单易用:与其他实时通信方式相比,SSE 的开发和实现相对简单,只需要使用浏览器中已经内置的 API 即可。
  • 跨域支持:由于它使用了标准的 HTTP 协议,因此 SSE 可以跨域使用。

SSE 的实现方法

以下是一个 SSE 实现的示例代码:

// 服务器端实现代码
const http = require('http');

http.createServer((req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive'
  });
  
  setInterval(() => {
    res.write(`data: ${new Date().toLocaleString()}\n\n`);
  }, 1000);
}).listen(3000);

// 客户端实现代码
const source = new EventSource('http://localhost:3000');

source.addEventListener('message', (event) => {
  console.log(event.data);
});

在服务器端,我们需要创建一个 HTTP 服务器,并在客户端请求时返回一个带有必要的头部信息的响应。在每次请求时,服务器会向浏览器推送一条包含时间戳的消息。

在客户端,我们可以使用 EventSource API 连接到服务器,并在服务器推送消息时触发 message 事件来接收数据。值得注意的是,SSE 接收的数据是文本格式,而不是 JSON 格式。在使用 SSE 时,需要设置响应类型为 text/event-stream

Ajax 实时通信

除了 SSE,我们也可以使用 Ajax 技术进行实时通信。Ajax 可以使用长轮询(Long Polling)和短轮询(Short Polling)两种方式。

长轮询

长轮询指的是浏览器向服务器发出请求,服务器一旦有数据更新就立刻响应,如果没有数据更新,服务器将暂时不响应请求,直到有更新的数据才会回复。长轮询实际上是一种模拟 SSE 的实现方式,它的原理是通过不断地向服务器发送请求,将服务器当作消息队列来使用。

长轮询的优点在于实时性比较高,且兼容性良好,但是它也存在着一些缺点,比如占用服务器资源,需要很多的 HTTP 请求等。

以下是一个长轮询的实现示例代码:

// 客户端实现代码
function longPolling() {
  $.ajax({
    url: '/api/getData',
    type: 'GET',
    async: true,
    cache: false,
    success: function(data) {
      console.log(data);
    },
    complete: function(XHR, TS) {
      if (TS === 'timeout') {
        longPolling();
      } else {
        setTimeout(longPolling, 0);
      }
    },
    timeout: 60000
  });
}

在这个例子中,我们使用 jQuery 的 ajax 方法来进行长轮询,timeout 属性用于设置超时时间,在超时时重新发起请求。

短轮询

短轮询指的是浏览器不断地向服务器发送请求,来获取服务器的更新数据。短轮询的实现较为简单,但是它存在一些明显的缺点,比如频繁的请求可能导致服务器压力增大,同时也会消耗用户的流量。

以下是一个短轮询的实现示例代码:

// 客户端实现代码
function shortPolling() {
  $.ajax({
    url: '/api/getData',
    type: 'GET',
    async: true,
    cache: false,
    success: function(data) {
      console.log(data);
    },
    complete: function(XHR, TS) {
      setTimeout(shortPolling, 1000);
    }
  });
}

总结

在实时通信中,Server-sent Events 和 Ajax 是两种常见且优秀的解决方案。SSE 相对于短轮询和长轮询而言,具有更好的兼容性、更低的服务器开销和更好的实时性。而 Ajax 可以通过长轮询和短轮询的方式实现实时通信,流量和服务器开销相对较大。开发人员应根据具体场景和需求,选择合适的实时通信方案。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b4800cadd4f0e0ffd6a7dd