当前位置:首页 > 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 提供了更强大的功能包括自动重连、房间支持等:

服务端

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>

添加用户身份标识

为消息添加发送者信息:

// 服务端
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 存储历史消息:

js实现聊天室

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实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现下拉刷新

js实现下拉刷新

监听触摸事件 通过监听 touchstart、touchmove 和 touchend 事件来检测用户下拉手势。记录触摸起始位置和移动距离。 let startY = 0; let curr…

js 实现mvc

js 实现mvc

MVC 模式简介 MVC(Model-View-Controller)是一种软件设计模式,将应用程序分为三个核心组件:模型(Model)处理数据和业务逻辑,视图(View)负责展示数据,控制器(Con…

js实现保存图片

js实现保存图片

使用Canvas绘制并保存图片 在HTML中创建一个Canvas元素,通过JavaScript绘制内容后转换为图片并保存。Canvas的toDataURL方法可将画布内容转为Base64编码的图片数据…