当前位置:首页 > JavaScript

js实现聊天

2026-03-01 12:12:58JavaScript

实现WebSocket聊天室

使用WebSocket协议可以实现实时双向通信,适合聊天场景。以下是一个简单的实现示例:

前端代码

const socket = new WebSocket('ws://your-server-address');

socket.onopen = () => {
  console.log('连接已建立');
  socket.send('用户加入聊天');
};

socket.onmessage = (event) => {
  const message = document.createElement('div');
  message.textContent = event.data;
  document.getElementById('chat-box').appendChild(message);
};

document.getElementById('send-btn').addEventListener('click', () => {
  const input = document.getElementById('message-input');
  socket.send(input.value);
  input.value = '';
});

后端Node.js代码

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());
      }
    });
  });
});

使用Socket.io简化实现

Socket.io提供了更简单的API和自动重连等功能:

js实现聊天

前端

const socket = io('http://your-server-address');

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 = '';
});

后端

const express = require('express');
const socketio = require('socket.io');

const app = express();
const server = app.listen(3000);
const io = socketio(server);

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

实现基本功能扩展

添加用户昵称功能:

js实现聊天

// 前端
socket.emit('set nickname', '用户昵称');

// 后端
socket.on('set nickname', (nickname) => {
  socket.nickname = nickname;
});

socket.on('chat message', (msg) => {
  io.emit('chat message', `${socket.nickname}: ${msg}`);
});

添加消息时间戳:

function formatTime(date) {
  return date.toLocaleTimeString();
}

io.emit('chat message', {
  text: msg,
  nickname: socket.nickname,
  time: formatTime(new Date())
});

实现消息持久化

使用数据库存储聊天记录:

const mongoose = require('mongoose');
const Message = mongoose.model('Message', {
  text: String,
  user: String,
  createdAt: { type: Date, default: Date.now }
});

io.on('connection', (socket) => {
  Message.find().sort('-createdAt').limit(10).exec((err, messages) => {
    socket.emit('load messages', messages.reverse());
  });

  socket.on('chat message', (msg) => {
    const message = new Message({ text: msg, user: socket.nickname });
    message.save();
    io.emit('chat message', msg);
  });
});

添加用户在线状态

跟踪在线用户:

let users = {};

io.on('connection', (socket) => {
  socket.on('new user', (nickname) => {
    users[socket.id] = nickname;
    io.emit('user joined', nickname);
    io.emit('update users', Object.values(users));
  });

  socket.on('disconnect', () => {
    const nickname = users[socket.id];
    delete users[socket.id];
    io.emit('user left', nickname);
    io.emit('update users', Object.values(users));
  });
});

这些代码示例展示了如何实现基本的聊天功能,可以根据需求进一步扩展如私聊、表情支持、文件传输等功能。

标签: js
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 或直接使用 window.location 实现页面跳转,适用于普通跳转或带参数的 URL。 // 方…

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li>&l…