当前位置:首页 > 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实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的H…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…