EventSource:从源头开始的纯前端实时通讯

一、EventSource 踩坑

EventSource是HTML5中用于服务器发送事件的API。现在,它被广泛用于实时通信场景。然而,使用EventSource时,我们也可能会遇到一些坑,下面介绍一些需要注意的方面。

1. 过程被断开和连接被拒绝

在使用EventSource向服务器请求时,msie10及以下(已停止更新的IE浏览器及edge浏览器)会出现断开过程的问题,Firefox也会在控制台中给出一个“委托受到网络错误的promise”的错误。我们可以通过使用polyfill等解决方案来解决这些问题。

2. 重复响应

当我们在使用EventSource向服务器请求时,可能会收到重复响应,这通常是由于缓存等原因导致的。我们可以通过添加一个时间戳或缓存控制来解决这些问题。

二、sources

EventSource可以从多种源中获取数据。下面介绍一些常见的sources。

1. 数组

const eventSource = new EventSource('/source.php', {data: ['idList[]=1&idList[]=2']});

我们可以通过在请求中添加data字段,将一些数据以数组的方式传递给服务器。

2. 携带cookie

const eventSource = new EventSource('/source.php', {withCredentials: true});

当我们需要携带cookie向服务器请求时,可以在创建EventSource实例时添加withCredentials: true来实现。

3. 自定义请求头

const eventSource = new EventSource('/source.php', {headers: {'Authorization': 'Bearer TOKEN'}});

有时,我们需要在请求头中添加自定义的信息来向服务器请求,通过在创建EventSource实例时添加headers字段即可实现。

三、EventSource 聊天

EventSource可以实现聊天室等在线通讯场景。下面介绍使用EventSource实现实时聊天的例子。

  
    const chat = document.getElementById('chat');
    const sendButton = document.getElementById('sendButton');
    const nameInput = document.getElementById('nameInput');
    const messageInput = document.getElementById('messageInput');
    const eventSource = new EventSource('/chat.php');

    eventSource.onmessage = (event) => {
      const message = JSON.parse(event.data);
      addMessageToList(message);
    };

    sendButton.addEventListener('click', (event) => {
      const message = {
        name: nameInput.value,
        message: messageInput.value
      };
      fetch('/chat.php', {
        method: 'POST',
        body: JSON.stringify(message)
      });
      messageInput.value = '';
    });

    const addMessageToList = (message) => {
      const messageElement = document.createElement('p');
      const nameSpan = document.createElement('span');
      const messageSpan = document.createElement('span');
      nameSpan.textContent = `${message.name}: `;
      messageSpan.textContent = message.message;
      messageElement.append(nameSpan, messageSpan);
      chat.append(messageElement);
    };
  

上面的代码演示了使用EventSource实现实时聊天的例子。在页面上,我们创建了发送消息的按钮、输入昵称、输入消息的文本框和一个用于展示聊天记录的列表。在JavaScript中,我们创建了一个EventSource实例,并通过onmessage事件监听消息。当有新消息到来时,我们将其添加到聊天记录中,并展示出来。

四、EventSource 小程序

EventSource也可以在小程序中使用,下面给出小程序中如何使用EventSource的例子。

  
    // app.js
    App({
      eventSource: null,
      onLaunch() {
        this.eventSource = new EventSource('/source.php');
      }
    });

    // page.js
    const app = getApp();

    Page({
      data: {
        message: ''
      },
      onLoad() {
        app.eventSource.onmessage = (event) => {
          this.setData({
            message: event.data
          });
        };
      }
    });
  

上面的例子是一个小程序中如何使用EventSource的示例代码。app.js中创建了一个EventSource实例,并在小程序启动时触发onLaunch函数。在page.js中,我们获取到app实例,在页面加载时监听onmessage事件,并通过this.setData()方法更新数据。

五、eventsource demo

下面提供一个简单的EventSource demo,演示EventSource实现实时通讯的过程:

  

    原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/304132.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    小蓝小蓝
    上一篇 2025-01-01 11:04
    下一篇 2025-01-01 11:04

    相关推荐

    • Chipscope: FPGA实时调试与分析工具

      一、介绍 Chipscope是由Xilinx公司开发的FPGA实时调试与分析工具。它可以帮助工程师进行硬件调试,找到在FPGA中的逻辑错误,针对逻辑错误进行调试,使得工程师可以快速…

      编程 2025-04-23
    • C# USB通讯实现,提高用户体验

      一、USB通讯原理 在进行C# USB通讯实现之前,需要了解一些USB通讯的原理。USB(Universal Serial Bus),即通用串行总线,是一种用于连接计算机与外设的通…

      编程 2025-04-23
    • 实时数据库3大厂商比较

      一、MongoDB MongoDB是一个基于分布式文件存储概念的开源数据库系统,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB的数据模型是面向…

      编程 2025-04-23
    • GoConvey:让测试更简单的实时测试反馈框架

      一、GoConvey 简介 GoConvey 是一个让测试更简单的实时测试反馈框架,它可以让您的测试更加容易编写、理解和组织,同时实时反馈让您在开发过程中节省了很多时间。 GoCo…

      编程 2025-04-22
    • 使用JavaScript实时显示当前时间

      一、获取当前时间 在JavaScript中获取当前时间的方法很简单,使用JavaScript内置的Date对象即可。Date对象的now()方法可以返回当前时间的毫秒数,再通过生成…

      编程 2025-04-22
    • Modbus RTU通讯实例详解

      一、Modbus RTU通讯是什么? Modbus RTU通讯是一种串行通讯协议,广泛应用于工业自动化领域。通过Modbus RTU通讯协议,能够实现在不同设备之间的数据交换。 在…

      编程 2025-04-20
    • InputOnInput——一个实时输入监听的事件

      在 Web 开发中,有许多种监听用户输入的事件,如 keydown、keyup、input 等。其中 input 事件因其实时性能和兼容性的优势,被广泛使用。 一、基本介绍 Inp…

      编程 2025-04-20
    • VueSocketIO: 在Vue.js应用程序中进行实时数据通信

      VueSocketIO是一个用于Vue.js应用程序的WebSocket库,它使得在Vue.js应用程序中进行实时数据通信变得很容易。VueSocketIO与Socket.IO一起…

      编程 2025-04-13
    • Koa WebSocket详解:构建实时通信应用

      一、什么是Koa WebSocket? Koa WebSocket是一个基于Koa应用框架的简单易用的WebSocket库,可以帮助开发者快速构建实时通信应用。Koa WebSoc…

      编程 2025-04-12
    • RDMA:实时数据访问和数据传输的高性能技术

      RDMA(Remote Direct Memory Access)是一种高性能的I/O传输机制,是一种用于实时数据访问和数据传输的操作系统网络协议,与TCP/IP不同。RDMA专门…

      编程 2025-04-02

    发表回复

    登录后才能评论