当前位置:首页 > 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、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…

js实现排序

js实现排序

数组排序方法 JavaScript提供了内置的sort()方法用于数组排序。默认情况下,sort()将元素转换为字符串并按照Unicode码点排序。对于数字排序,需传入比较函数。 const num…