当前位置:首页 > 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和自动重连等功能:

前端

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

实现基本功能扩展

添加用户昵称功能:

// 前端
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);
  });
});

添加用户在线状态

跟踪在线用户:

js实现聊天

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实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js实现轮播图

js实现轮播图

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

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Promise…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…