在 React 中使用 WebSockets 構建實時聊天應用程序

????????實時通信已成為現代 Web 應用程序(尤其是在聊天應用程序中)不可或缺的功能。實時通信提供了一種強大的方法來實現客戶端和服務器之間的實時雙向通信。在本指南中,我們將逐步講解如何使用React WebSockets構建實時聊天應用程序。

先決條件

在深入研究之前,請確保您具備以下條件:

? 對 React 有基本的了解。
? 您的機器上安裝了 Node.js。
? npm類似或 yarn 的包管理器。
? 熟悉 WebSocket 概念。

步驟 1:設置后端

我們需要一個 WebSocket 服務器來處理實時通信。我們將使用 Node.js 的 ws 包。

1、初始化 Node.js 項目:

mkdir chat-backend ?
cd chat-backend ?
npm init -y ?

2、安裝 ws 包:

npm install ws?

3、創建 WebSocket 服務器:

// server.js ?
const WebSocket = require('ws'); ?

const wss = new WebSocket.Server({ port: 8080 }); ?

wss.on('connection', (ws) => {
? ? console.log('Client connected'); ?

? ? ws.on('message', (message) => {
? ? ? ? console.log(`Received: ${message}`); ?
? ? ? ? // Broadcast the message to all clients
? ? ? ? wss.clients.forEach((client) => {
? ? ? ? ? ? if (client.readyState === WebSocket.OPEN) {
? ? ? ? ? ? ? ? client.send(message); ?
? ? ? ? ? ? }
? ? ? ? });
? ? }); ?

? ? ws.on('close', () => {
? ? ? ? console.log('Client disconnected'); ?
? ? });
}); ?

console.log('WebSocket server running on ws://localhost:8080'); ?

4、運行服務器:

node server.js

第 2 步:設置 React 前端

1、創建一個新的 React 應用:

npx create-react-app chat-frontend ?
cd chat-frontend ?

2、WebSocket安裝 WebSocket 的依賴項:

由于將使用瀏覽器的本機 API,因此不需要額外的依賴項。

步驟3:構建聊天界面

1、創建聊天組件:

// src/components/Chat.js ?
import React, { useState, useEffect, useRef } from 'react'; ?

const Chat = () => {
? ? const [messages, setMessages] = useState([]); ?
? ? const [input, setInput] = useState(''); ?
? ? const ws = useRef(null); ?

? ? useEffect(() => {
? ? ? ? ws.current = new WebSocket('ws://localhost:8080'); ?

? ? ? ? ws.current.onmessage = (event) => {
? ? ? ? ? ? setMessages((prev) => [...prev, event.data]); ?
? ? ? ? }; ?

? ? ? ? return () => {
? ? ? ? ? ? ws.current.close(); ?
? ? ? ? };
? ? }, []); ?

? ? const sendMessage = () => {
? ? ? ? if (input.trim()) {
? ? ? ? ? ? ws.current.send(input); ?
? ? ? ? ? ? setInput(''); ?
? ? ? ? }
? ? }; ?

? ? return (
? ? ? ? <div style={{ padding: '20px', maxWidth: '400px', margin: '0 auto', textAlign: 'center' }}>
? ? ? ? ? ? <h2>Real-Time Chat</h2>
? ? ? ? ? ? <div
? ? ? ? ? ? ? ? style={{
? ? ? ? ? ? ? ? ? ? border: '1px solid #ccc',
? ? ? ? ? ? ? ? ? ? borderRadius: '5px',
? ? ? ? ? ? ? ? ? ? padding: '10px',
? ? ? ? ? ? ? ? ? ? maxHeight: '300px',
? ? ? ? ? ? ? ? ? ? overflowY: 'scroll',
? ? ? ? ? ? ? ? }}
? ? ? ? ? ? >
? ? ? ? ? ? ? ? {messages.map((msg, index) => (
? ? ? ? ? ? ? ? ? ? <div key={index} style={{ textAlign: 'left', margin: '5px 0' }}>
? ? ? ? ? ? ? ? ? ? ? ? {msg}
? ? ? ? ? ? ? ? ? ? </div>
? ? ? ? ? ? ? ? ))}
? ? ? ? ? ? </div>
? ? ? ? ? ? <div style={{ marginTop: '10px' }}>
? ? ? ? ? ? ? ? <input
? ? ? ? ? ? ? ? ? ? type="text"
? ? ? ? ? ? ? ? ? ? value={input}
? ? ? ? ? ? ? ? ? ? onChange={(e) => setInput(e.target.value)}
? ? ? ? ? ? ? ? ? ? style={{
? ? ? ? ? ? ? ? ? ? ? ? padding: '8px',
? ? ? ? ? ? ? ? ? ? ? ? width: '70%',
? ? ? ? ? ? ? ? ? ? ? ? marginRight: '5px',
? ? ? ? ? ? ? ? ? ? ? ? borderRadius: '5px',
? ? ? ? ? ? ? ? ? ? ? ? border: '1px solid #ccc',
? ? ? ? ? ? ? ? ? ? }}
? ? ? ? ? ? ? ? />
? ? ? ? ? ? ? ? <button
? ? ? ? ? ? ? ? ? ? onClick={sendMessage}
? ? ? ? ? ? ? ? ? ? style={{
? ? ? ? ? ? ? ? ? ? ? ? padding: '8px 12px',
? ? ? ? ? ? ? ? ? ? ? ? borderRadius: '5px',
? ? ? ? ? ? ? ? ? ? ? ? border: 'none',
? ? ? ? ? ? ? ? ? ? ? ? backgroundColor: '#007BFF',
? ? ? ? ? ? ? ? ? ? ? ? color: '#fff',
? ? ? ? ? ? ? ? ? ? }}
? ? ? ? ? ? ? ? >
? ? ? ? ? ? ? ? ? ? Send
? ? ? ? ? ? ? ? </button>
? ? ? ? ? ? </div>
? ? ? ? </div>
? ? );
};

export default Chat; ?

2、在您的 App.js 中使用聊天組件:

import React from 'react'; ?
import Chat from './components/Chat'; ?

function App() {
? ? return <Chat />; ?
} ?

export default App; ?

3、啟動 React 應用:

npm start ?

步驟4:測試應用程序

? 在多個選項卡或設備中打開您的 React 應用程序。
? 開始在一個選項卡中輸入消息,并實時觀察它們出現在所有連接的客戶端中!

其他增強功能

為了使應用程序可以投入生產,請考慮

? 為個性化消息添加用戶身份驗證。
? 集成數據庫來存儲聊天記錄。
? 將 WebSocket 服務器和 React 應用程序部署到 Vercel、Heroku 或 AWS 等平臺。

總結

????????我們利用 WebSockets,使用 React 構建了一個輕量級的實時聊天應用程序。該項目展示了 WebSockets 在動態通信方面的強大功能,它適用于各種應用,例如消息平臺、游戲和實時通知。深入了解 WebSocket 協議,進一步增強您的應用程序!

如果您喜歡此文章,請收藏、點贊、評論,謝謝,祝您快樂每一天。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87617.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87617.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87617.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實驗五-Flask的簡易登錄系統

一、實驗目的和任務 1.掌握Flask框架的基本使用方法 2.理解Web應用的會話管理機制 3.實現用戶認證系統的基本功能 4.學習模板繼承和表單處理技術 要求&#xff1a;請將思考題的答案寫在實驗報告中 二、實驗內容 1.基礎環境搭建&#xff1a;創建項目目錄結構、安裝必要依賴包…

WebSocket類明明注入了Bean,為什么報錯為null

在 WebSocket 類中注入 Bean 看似可行而注入 Bean 報錯為null&#xff0c;通常是由于Spring 的單例管理機制與 WebSocket 多實例創建特性沖突導致的&#xff0c;具體分析如下&#xff1a;原因分析Spring 的單例特性&#xff1a;Spring 默認以單例模式管理 Bean&#xff0c;即一…

Python 爬蟲開發指南:從基礎到實戰

在大數據時代&#xff0c;數據成為了寶貴的資源。Python 爬蟲作為高效獲取網絡數據的工具&#xff0c;受到越來越多開發者的關注。本文將詳細介紹 Python 爬蟲的相關知識&#xff0c;助你快速入門并掌握爬蟲開發的核心要點。 一、Python 爬蟲概述 Python 爬蟲&#xff0c;即網…

99、git 超時問題

報錯&#xff1a; Push failed ssh: connect to host github.com port 22: Connection timed out Could not read from remote repository

CountDownLatch 詳細介紹

CountDownLatch 是 Java 中 java.util.concurrent 包提供的一個同步工具類&#xff0c;用于協調多個線程之間的執行順序。它允許一個或多個線程等待&#xff0c;直到其他線程完成一組操作后繼續執行。CountDownLatch 是一種倒計數鎖存器&#xff0c;通過設置一個初始計數器值&a…

Hadoop之HDFS

Hadoop之HDFS HDFS的Shell操作 啟動Hadoop集群(方便后續測試) [atguigu@hadoop102 ~]$ sbin/start-dfs.sh [atguigu@hadoop102 ~]$ sbin/start-yarn.sh-help:輸出這個命令參數 [atguigu@hadoop102 ~]$ hadoop fs -help rm-ls:顯示目錄信息 [atguigu@hadoop102 ~]$ hadoop …

【1.4 漫畫PostgreSQL高級數據庫及國產數據庫對比】

&#x1f418; 漫畫PostgreSQL高級數據庫及國產數據庫對比 &#x1f468;?&#x1f4bb; 小明&#xff1a;“老王&#xff0c;除了MySQL&#xff0c;還有哪些優秀的關系型數據庫&#xff1f;國產數據庫發展得怎么樣&#xff1f;” &#x1f9d9;?♂? 架構師老王&#xff1a;…

OLT、ONU、ONT、SFU、HGU、ODN,它們是什么?它們之間有什么區別?

我們經常會看到OLT、ONU、ONT、SFU、HGU等設備術語。它們分別是什么?又有什么區別呢? PON組件:OLT、ONU、ONT和ODN 無源光網絡(PON)采用光纖和分路器&#xff0c;以點對多點拓撲將數據從單一源分發到多個用戶。與有源光網絡 (AON)不同&#xff0c;PON 僅在光域中運行&#…

sql USING 簡化 JOIN 操作

在 SQL 中&#xff0c;USING 是一種用于簡化 JOIN 操作的語法糖&#xff0c;它允許你明確指定連接表時所依據的列名。與傳統的 ON 子句相比&#xff0c;USING 提供了更簡潔的語法1. 基本語法與作用table1 JOIN table2 USING (column_name);將 table1 和 table2 中 column_name …

android開發中的 AndroidX 版本的查看 及 constraintLayout的簡單用法

1、查看庫的版本 平常我們經常會用到一些庫&#xff0c;但是不知道是什么版本&#xff0c;也不知道最新的是什么版本&#xff0c;當然最好的就是到官網去查看&#xff0c;或者三方的maven庫。 2、官方地址 AndroidX 版本 | Jetpack | Android Developers 3、比如我們來…

oracle鎖表,oracle解鎖表,oracle用戶連接數

一、查看被鎖的表 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$session sess where ao.object_id lo.object_id and lo.session_id sess.sid; 二、解鎖表語句 alter …

3D可視化:開啟多維洞察新時代

3D可視化技術以一種前所未有的方式&#xff0c;將數據、模型與現實世界緊密相連&#xff0c;為人們帶來了沉浸式、交互式的全新體驗&#xff0c;徹底革新了信息的呈現與理解方式。一、3D可視化的技術原理從技術本質來看&#xff0c;3D可視化基于一系列復雜而精妙的原理。通過數…

List中的對象進行排序處理

以下是使用 Java Stream 對對象列表按 id 和 age 排序的完整示例&#xff0c;包含升序和降序兩種場景&#xff1a; 1. 定義測試對象類 Getter Setter public class Person {private int id;private int age; }2. 排序實現代碼 import java.util.*; import java.util.stream.…

秋招Day14 - Redis - 底層結構

Redis都有哪些底層數據結構&#xff1f; 有八種核心的底層數據結構。 SDS Redis自己實現的動態字符串&#xff0c;SDS結構中直接存儲了已使用的字符數組長度len和未使用的字符數組長度free&#xff0c;所以獲取長度的時間復雜度是O(1)&#xff0c;還支持動態擴容&#xff0c…

使用Mac自帶的圖像捕捉導出 iPhone 相冊

用 數據線 將 iPhone 連接到 Mac必須是數據線,有些充電線插上去后無法識別到iphone在 iPhone 上點擊“信任此電腦”在 Mac 上打開應用&#xff1a;快速方式&#xff1a;按 Command Space 打開 Spotlight&#xff0c;輸入 圖像捕捉 或 Image Capture&#xff0c;回車或者從 /系…

【UniApp picker-view 多列對齊問題深度剖析與完美解決】

UniApp picker-view 多列對齊問題深度剖析與完美解決一次看似簡單的樣式調整&#xff0c;卻引發了對構建工具、CSS 預處理和組件渲染機制的深度思考創作時間: 2025/7/1 技術棧: UniApp Vue3 TypeScript PostCSS 問題級別: &#x1f534; 高級&#x1f3af; 問題背景 在開發 …

R Studio開發中記錄

1.如何將tar.gz格式的源碼R包編譯為zip格式的二進制R包。 R CMD INSTALL --build knhanes.tar.gz R CMD INSTALL --build nhanes.tar.gz 2.下載RTools RTools: Toolchains for building R and R packages from source on Windows 3.修改環境變量 PATH$PATH:/d/rtools45/usr…

量化交易中的隱藏模式識別:基于潛在高斯混合模型的機會挖掘

*——從市場噪聲中提取黃金信號的數學藝術** > 2025年3月,某對沖基金使用潛在高斯混合模型捕捉到銅期貨的異常波動模式,提前布局實現單月收益47%。核心代碼僅20行,卻顛覆了傳統技術分析范式。 --- ### 01 市場迷思:為何90%的交易者失敗? 金融市場本質是**非…

Qt窗口被外部(非Qt內部機制)強制銷毀,第二次再重復使用不顯示

在Qt開發中&#xff0c;窗口被外部&#xff08;非Qt內部機制&#xff09;強制銷毀 警告信息 External WM_DESTROY received for QWidgetWindow(0x108b8cbdb10, name"xxxxx") , parent: QWindow(0x0) , transient parent: QWindow(0x0) 使用場景 代碼結構如下&#x…

一文詳解Character AI:實用指南+ ChatGPT、Gemini對比分析

本指南將深入剖析Character AI的運行機制、功能特性及其存在的局限性。 近年來&#xff0c;生成式人工智能領域發展態勢迅猛&#xff0c;其應用范疇已遠超單純的文本生成領域。在眾多備受矚目的新興平臺中&#xff0c;Character AI是一款支持用戶以對話形式與人工智能生成角色…