当前位置: 首页 > news >正文

编写一个基于React的聊天室

前言

此前已经编写了一版后端的im,此次就用其作为服务端,可查看参考资料1

代码

使用WebStorm创建React项目

安装依赖包

PS C:\learn-demo\front\chatroom> npm installadded 183 packages, and audited 184 packages in 16s43 packages are looking for fundingrun `npm fund` for detailsfound 0 vulnerabilities

创建ChatRoom.tsx

import React, { useState, ChangeEvent } from 'react';const ChatRoom: React.FC = () => {const [message, setMessage] = useState('');const [messages, setMessages] = useState<string[]>([]);const [socket, setSocket] = useState<WebSocket | null>(null);const [userName, setUserName] = useState('');const handleSendMessage = () => {if (socket && message) {socket.send(message);setMessage('');}};const handleConnected = () => {if (userName) {setUserName(userName);createWebSocket(userName);}};const handleInputChange = (event: ChangeEvent<HTMLInputElement>) => {setMessage(event.target.value);};const handleInputName = (event: ChangeEvent<HTMLInputElement>) => {setUserName(event.target.value);};const createWebSocket = (userName: string) => {setMessages(prevMessages => [...prevMessages, `welcome 【${userName}】`])if (userName){setUserName(userName);}else {return;}//关闭已有websocket连接if (socket){socket.close()}const newSocket = new WebSocket(`ws://localhost:18080/ws?userName=${userName}`);newSocket.onopen = () => {console.log('Connected to the WebSocket server');};newSocket.onmessage = (event: MessageEvent) => {setMessages(prevMessages => [...prevMessages, event.data]);};newSocket.onclose = () => {console.log('Disconnected from the WebSocket server');};setSocket(newSocket);}return (<div><ul>{messages.map((msg, index) => (<li key={index}>{msg}</li>))}</ul><inputtype="text"value={userName}onChange={handleInputName}/><button onClick={handleConnected}>Connected</button><br/><inputtype="text"value={message}onChange={handleInputChange}/><button onClick={handleSendMessage}>Send</button></div>);
};export default ChatRoom;

修改main.tsx

import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import ChatRoom from "./component/ChatRoom.tsx";createRoot(document.getElementById('root')!).render(<StrictMode><ChatRoom /></StrictMode>,
)

测试

  • 运行项目,打开三个http://localhost:5173/的页面

分别以不同用户名(test1、test2、test3)连接websocket,步骤是第一行输入框输入用户名,然后点击Connected按钮

  • test1发送全体消息

第二行输入框输入消息,点击Send按钮

test2、test3均收到消息

  • test1发送消息给test2

test2收到消息

test3未收到消息

调整后端代码

上述消息分不清到底是谁发给用户的,调整下im服务的代码

SendExecutorFactory

public void onMessage(String sendUserName, String message) {IBaseSendExecutor iBaseSendExecutor = Optional.ofNullable(executorConfiguration.getBaseSendExecutorMap().get(webSocketProperties.getCommunicationType())).orElse(new DefaultSendExecutor());message = String.format("【%s】: %s", sendUserName, message);//包含@发给指定人,否则发给全部人if (StringUtils.contains(message, webSocketProperties.getReceiverSeparator())) {iBaseSendExecutor.sendToUser(sendUserName, message);} else {iBaseSendExecutor.sendToAll(sendUserName, message);}
}

重新启动服务端,发送消息

页面上重新连接,test1发送全体消息

test2、test3均收到test1的消息

参考资料

[1].im后端代码

[2].chatroom前端项目

http://www.lryc.cn/news/479933.html

相关文章:

  • [前端]NodeJS常见面试题目
  • 【实测可用】Sublime Text4 4180 windows 已测可用
  • JAVA日期加减运算 JsonObject 转换对象List
  • 在 PostgreSQL 中,重建索引可以通过 `REINDEX` 命令来完成
  • SQL相关常见的面试题
  • Vue数据响应式原理
  • Electron + Vue3 开发桌面应用+附源码
  • Webserver(5.2)网页服务器框架
  • 股指期货交易中,如何应对震荡行情?
  • 理想汽车Android面试题及参考答案
  • 【数据集】【YOLO】【目标检测】口罩佩戴识别数据集 1971 张,YOLO佩戴口罩检测算法实战训练教程!
  • 前端将后端返回的文件下载到本地
  • GISBox VS ArcGIS:分别适用于大型和小型项目的两款GIS软件
  • 掌握分布式系统的38个核心概念
  • 如何使用 VNC 服务器连接桌面
  • 算法每日练 -- 双指针篇(持续更新中)
  • 读取excel并且显示进度条
  • MySQL多表查询习题
  • HTML静态网页成品作业(HTML+CSS)——阜阳剪纸介绍设计制作(1个页面)
  • 创新引领,模块化微电网重塑能源格局
  • LeetCode34:在排序数组中查找元素第一个和最后一个位置
  • 汽车广告常见特效处理有哪些?
  • Unexpected response code: 400解决
  • 世优科技携手人民中科打造AI数字人智能体助力智慧校园
  • Mac intel 安装IDEA激活时遇到问题 jetbrains.vmoptions.plist: Permission denied
  • 区块链应用第1讲:基于区块链的智慧货运平台
  • 量化交易系统开发-实时行情自动化交易-风险控制
  • 深入探索 Seaborn:高级绘图的艺术与实践
  • 《现代工业经济和信息化》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • 【TS】九天学会TS语法——2.TypeScript基本类型及变量声明