实时通信已成为现代 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是一款支持用户以对话形式与人工智能生成角色…