当前位置:首页 > JavaScript

js实现聊天室

2026-03-01 19:48:50JavaScript

使用 WebSocket 实现基础聊天室

WebSocket 是 HTML5 提供的全双工通信协议,适合实时聊天场景。以下是一个基础实现方案:

服务端(Node.js + ws 库)

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

wss.on('connection', (ws) => {
  ws.on('message', (message) => {
    wss.clients.forEach((client) => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(message.toString());
      }
    });
  });
});

客户端

const ws = new WebSocket('ws://localhost:8080');
ws.onopen = () => console.log('Connected');
ws.onmessage = (e) => {
  const chatBox = document.getElementById('chat');
  chatBox.innerHTML += `<div>${e.data}</div>`;
};

function sendMessage() {
  const input = document.getElementById('message');
  ws.send(input.value);
  input.value = '';
}

使用 Socket.IO 增强功能

Socket.IO 提供了更强大的功能包括自动重连、房间支持等:

js实现聊天室

服务端

const io = require('socket.io')(3000);
io.on('connection', (socket) => {
  socket.on('chat message', (msg) => {
    io.emit('chat message', msg);
  });
});

客户端

<script src="/socket.io/socket.io.js"></script>
<script>
  const socket = io();
  socket.on('chat message', (msg) => {
    const item = document.createElement('li');
    item.textContent = msg;
    document.getElementById('messages').appendChild(item);
  });

  document.getElementById('form').addEventListener('submit', (e) => {
    e.preventDefault();
    const input = document.getElementById('input');
    socket.emit('chat message', input.value);
    input.value = '';
  });
</script>

添加用户身份标识

为消息添加发送者信息:

js实现聊天室

// 服务端
socket.on('chat message', (data) => {
  io.emit('chat message', {
    user: socket.id.slice(0, 5),
    text: data.text,
    time: new Date().toLocaleTimeString()
  });
});

// 客户端显示
socket.on('chat message', (data) => {
  const msg = `${data.time} [${data.user}]: ${data.text}`;
  // 添加到聊天界面
});

实现私聊功能

通过房间机制实现私密对话:

// 加入房间
socket.on('join room', (room) => {
  socket.join(room);
});

// 房间消息
socket.on('private message', ({ room, text }) => {
  io.to(room).emit('private message', text);
});

前端界面示例

基础聊天界面结构:

<div id="chat-container">
  <div id="message-area"></div>
  <input type="text" id="message-input" placeholder="Type message...">
  <button onclick="sendMessage()">Send</button>
</div>

<style>
  #chat-container {
    width: 400px;
    margin: 0 auto;
  }
  #message-area {
    height: 300px;
    border: 1px solid #ccc;
    overflow-y: auto;
    margin-bottom: 10px;
  }
</style>

消息持久化方案

使用 MongoDB 存储历史消息:

const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/chat');

const messageSchema = new mongoose.Schema({
  user: String,
  text: String,
  timestamp: { type: Date, default: Date.now }
});

const Message = mongoose.model('Message', messageSchema);

// 保存消息
socket.on('chat message', async (data) => {
  const msg = new Message(data);
  await msg.save();
  io.emit('chat message', data);
});

// 获取历史
app.get('/messages', async (req, res) => {
  const messages = await Message.find().sort('-timestamp').limit(50);
  res.json(messages);
});

部署注意事项

  1. 生产环境应使用 HTTPS 和 WSS 协议
  2. 考虑添加消息速率限制防止滥用
  3. 实现用户认证系统
  4. 使用 Redis 适配器实现多服务器扩展
  5. 添加消息内容过滤机制

以上方案可根据实际需求组合使用,完整实现需要配合后端 API 进行用户认证和状态管理。

标签: 聊天室js
分享给朋友:

相关文章

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…