最新文章
前端实现实时聊天功能的完整指南
发布时间:2025-06-20
热度:
// 建立WebSocket连接 const socket = new WebSocket('ws://your-server-address'); // 连接打开时 socket.addEventListener('open', (event) => { console.log('WebSocket连接已建立'); }); // 接收消息 socket.addEventListener('message', (event) => { const message = JSON.parse(event.data); // 处理接收到的消息 handleNewMessage(message); }); // 错误处理 socket.addEventListener('error', (error) => { console.error('WebSocket错误:', error); }); // 连接关闭时 socket.addEventListener('close', (event) => { console.log('WebSocket连接已关闭'); });
import React, { useState, useEffect } from 'react'; function ChatApp() { const [messages, setMessages] = useState([]); const [inputValue, setInputValue] = useState(''); const [socket, setSocket] = useState(null); useEffect(() => { // 组件挂载时建立WebSocket连接 const ws = new WebSocket('ws://your-server-address'); setSocket(ws); ws.addEventListener('message', (event) => { const newMessage = JSON.parse(event.data); setMessages(prev => [...prev, newMessage]); }); return () => { // 组件卸载时关闭连接 ws.close(); }; }, []); const handleSendMessage = () => { if (inputValue.trim() && socket) { const message = { text: inputValue, timestamp: new Date().toISOString(), sender: 'user' }; socket.send(JSON.stringify(message)); setInputValue(''); } }; return ( <div className="chat-container"> <div className="messages"> {messages.map((msg, index) => ( <div key={index} className={`message ${msg.sender}`}> {msg.text} </div> ))} </div> <div className="input-area"> <input type="text" value={inputValue} onChange={(e) => setInputValue(e.target.value)} onKeyPress={(e) => e.key === 'Enter' && handleSendMessage()} /> <button onClick={handleSendMessage}>发送</button> </div> </div> ); }
.chat-container { display: flex; flex-direction: column; height: 500px; width: 400px; border: 1px solid #ccc; border-radius: 8px; overflow: hidden; } .messages { flex: 1; padding: 10px; overflow-y: auto; background-color: #f9f9f9; } .message { margin: 5px 0; padding: 8px 12px; border-radius: 18px; max-width: 70%; } .message.user { align-self: flex-end; background-color: #007bff; color: white; } .message.other { align-self: flex-start; background-color: #e9ecef; } .input-area { display: flex; padding: 10px; border-top: 1px solid #ccc; background-color: white; } .input-area input { flex: 1; padding: 8px; border: 1px solid #ccc; border-radius: 4px; margin-right: 8px; } .input-area button { padding: 8px 16px; background-color: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer; }
// 保存消息到本地存储 const saveMessages = (messages) => { localStorage.setItem('chatMessages', JSON.stringify(messages)); }; // 从本地存储加载消息 const loadMessages = () => { const saved = localStorage.getItem('chatMessages'); return saved ? JSON.parse(saved) : []; }; // 在React组件中使用 useEffect(() => { setMessages(loadMessages()); }, []); useEffect(() => { saveMessages(messages); }, [messages]);
// 在WebSocket连接建立后发送用户上线通知 socket.addEventListener('open', () => { socket.send(JSON.stringify({ type: 'presence', status: 'online', userId: 'current-user-id' })); }); // 在组件卸载时发送离线通知 useEffect(() => { return () => { if (socket) { socket.send(JSON.stringify({ type: 'presence', status: 'offline', userId: 'current-user-id' })); } }; }, [socket]);
// 实现WebSocket自动重连 function connectWebSocket() { const ws = new WebSocket('ws://your-server-address'); ws.onclose = () => { setTimeout(() => connectWebSocket(), 5000); // 5秒后重连 }; return ws; }