使用 React 和 Server-Sent Events 构建实时聊天应用

阅读时长 7 分钟读完

在现代 Web 应用程序中,实时性已经成为了重要的需求,特别是在在线聊天或协作应用中。基于 HTTP 的 WebSockets 协议无疑是最流行的实现方式之一,但是它可能并不适合所有的场景。在本文中,我们将探讨如何使用 Server-Sent Events(以下简称 SSE)和 React 构建一个简单但功能强大的实时聊天应用程序。

什么是 SSE?

Server-Sent Events 是一种基于 HTTP 的协议,用于在浏览器和服务器之间实现实时通信。与 WebSockets 不同,SSE 不需要建立长连接,而是通过标准的 HTTP 请求和响应机制。服务器端向客户端发送一条消息时,它会将此消息作为一个事件流发送给客户端,而客户端则可以使用 EventSource API 来接收和处理这个事件流消息。

SSE 支持以下特性:

  • 支持浏览器与服务器之间的实时通信。
  • 通过 HTTP(不需要握手)发送事件流消息。
  • 支持重新连接,自动重连当连接中断时。
  • 没有必要额外的 JavaScript 库或框架,原生的浏览器 API 就可以使用 SSE。
  • 在不支持 WebSocket 的环境下也可以使用 SSE。

构建聊天应用的基本思路

我们将使用 SSE 来实现客户端和服务器端的实时通信,React 用于构建前端 UI。我们的聊天应用将基于以下的基本构想:

  1. 客户端连接到服务器,以接收来自其他聊天室成员的消息。
  2. 客户端在输入框中输入消息并将其发送到服务器。
  3. 服务器将接收到的消息广播给聊天室中的所有客户端。

以下是我们将聊天应用程序分为三个主要组件:

  1. ChatApp: 该组件是聊天应用的主要界面,并渲染用户列表(已连接的用户列表)和聊天消息。
  2. MessageList: 该组件是展示聊天消息的组件,它接收一个消息列表并渲染每个消息。
  3. MessageForm: 该组件允许用户向聊天室发送消息。

为聊天应用程序设置 SSE

我们将使用 Express 和 Node.js 来创建简单的服务器。在服务器上实现 SSE 是非常简单的。首先,我们需要设置一个 /stream 路由作为 SSE 的服务端点。

在这里,我们设置了响应标头 Content-Typetext/event-stream,使其成为 SSE,同时 Cache-Control 标头被设置为 no-cache,以确保浏览器不会进行缓存。Connection 标头被设置为 keep-alive,因为 SSE 的过程中需要维持打开的 HTTP 连接,直到客户端请求关闭它为止。

现在,我们可以编写 SSE 服务器代码来定期发送事件消息给客户端。

-- -------------------- ---- -------
-------- ---------------- ------ ----- -
  ----------------- -------------
  ---------------- ------------------------------
-

-------------- -- -
  ----- ------- - ----------
  ---------------- -------------- ---------
-- ------

在这里,我们使用 sendMessage 函数发送事件消息。在这个函数中,我们使用了 SSE 规范中的事件和数据字段来创建 SSE 事件消息。我们定期调用此函数以发送特定事件消息。

创建 React 组件

现在我们来编写 React 组件来实现 UI。我们可以创建一个 ChatApp 组件,它负责呈现聊天应用程序的整体 UI,并渲染 MessageListMessageForm

-- -------------------- ---- -------
-------- --------- -
  ----- ---------- ------------ - -------------
  
  -- --- -----

  ----- ----------------- - --------- -- -
    -- -----------
  --

  ------ -
    -----
      ------------ ------------------- --
      ------------ --------------------------------- --
    ------
  --
-

其中,useState 被用于维护消息列表 messages。我们将在后面的章节中对此进行更新。

现在,我们需要捕获 SSE 事件流来接收从服务器发送的消息。为此,请创建一个 useSSE Hook,它充当 SSE 客户端。

-- -------------------- ---- -------
-------- -------- -
  ----- ---------- ------------ - -------------

  ------------ -- -
    ----- ------ - --- -----------------------

    -------------- - ----- -- -
      -------------------
      ---------------
    --

    -------------------------------------- ---- -- -
      ----- ---- - --------------------
      ------------------ -- --------- -------
    ---

    ------ -- -- -
      ---------------
    --
  -- ----

  ------ ---------
-

在这里,我们使用 useEffectEventSource 来设置 SSE 客户端。使用 useState 创建消息状态,然后我们建立 SSE 连接以接收 new_message 事件,并将每个新消息添加到状态中。

我们可以随时取消 SSE 连接,以避免内存泄漏。

最后,我们需要编写 MessageForm 组件,它负责接收用户消息并将它们发送到服务器。

-- -------------------- ---- -------
-------- ------------- ------------- -- -
  ----- --------- ----------- - -------------

  ----- ------------ - --- -- -
    -------------------
    -----------------------
    ---------------
  --

  ------ -
    ----- ------------------------
      ------
        -----------
        ---------------
        ------------- -- ---------------------------
      --
      ------- ---------------------------
    -------
  --
-

在这里,MessageForm 接收 onSendMessage 函数作为 prop。我们只需从 handleSubmit 回调函数中调用它并传递当前消息即可。

现在,我们已经准备好了,我们可以将所有部分组合在一起,并创建一个简单、实时的聊天应用程序。

示例代码

完整的代码可以访问:使用 React 和 Server-Sent Events 构建实时聊天应用

使用 Git 克隆或下载并解压此存储库后,先打开命令行,进入到 sse-react-chat-master 文件夹中,然后安装所有必须的 NPM 模块:

然后运行应用程序:

最后在浏览器中打开 http://localhost:3000 即可体验实时聊天应用程序。

总结

在这篇文章中,你学习了如何使用 SSE 和 React 来构建一个实时聊天应用程序。通过所提供的示例代码、说明和许多实践的架构环节的领导,你已经可以启动并运行一个实时聊天应用程序了。这扩展了你的接触表面,包括 React 和 Server-Sent Events。在以后的学习中,它将为你提供强有力的工具,以创建可靠的实时 Web 应用程序。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/654368d57d4982a6ebd282d4

纠错
反馈