当前位置:首页 > JavaScript

js实现在线即时聊天

2026-01-30 20:13:45JavaScript

使用WebSocket实现即时聊天

WebSocket是一种在单个TCP连接上进行全双工通信的协议,适合实时聊天应用。

// 客户端代码
const socket = new WebSocket('ws://your-server-address');

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

socket.onmessage = (event) => {
    const chatBox = document.getElementById('chat-box');
    chatBox.innerHTML += `<div>${event.data}</div>`;
};

function sendMessage() {
    const message = document.getElementById('message-input').value;
    socket.send(message);
}

使用Socket.io库简化开发

Socket.io是建立在WebSocket之上的库,提供了更简单的API和自动重连等功能。

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

socket.on('connect', () => {
    console.log('已连接');
});

socket.on('chat message', (msg) => {
    document.getElementById('chat-box').innerHTML += `<div>${msg}</div>`;
});

function sendMessage() {
    const message = document.getElementById('message-input').value;
    socket.emit('chat message', message);
}

服务器端实现(Node.js + Express)

const express = require('express');
const http = require('http');
const socketIo = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = socketIo(server);

io.on('connection', (socket) => {
    console.log('新用户连接');

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

    socket.on('disconnect', () => {
        console.log('用户断开连接');
    });
});

server.listen(3000, () => {
    console.log('服务器运行在端口3000');
});

前端界面基本结构

<div id="chat-box" style="height: 300px; overflow-y: scroll;"></div>
<input id="message-input" type="text" placeholder="输入消息">
<button onclick="sendMessage()">发送</button>

实现用户身份识别

为每个连接的用户添加唯一标识和昵称。

// 服务器端
io.on('connection', (socket) => {
    socket.on('set nickname', (nickname) => {
        socket.nickname = nickname;
        io.emit('chat message', `${nickname} 加入了聊天`);
    });

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

消息历史记录功能

服务器可以存储最近的聊天记录,新用户连接时发送历史消息。

const messageHistory = [];
const MAX_HISTORY = 100;

io.on('connection', (socket) => {
    socket.emit('history', messageHistory);

    socket.on('chat message', (msg) => {
        const fullMessage = `${socket.nickname}: ${msg}`;
        messageHistory.push(fullMessage);
        if (messageHistory.length > MAX_HISTORY) {
            messageHistory.shift();
        }
        io.emit('chat message', fullMessage);
    });
});

客户端优化处理

添加消息发送后的输入框清空和滚动到底部功能。

function sendMessage() {
    const messageInput = document.getElementById('message-input');
    const message = messageInput.value;
    if (message.trim()) {
        socket.emit('chat message', message);
        messageInput.value = '';
        scrollToBottom();
    }
}

function scrollToBottom() {
    const chatBox = document.getElementById('chat-box');
    chatBox.scrollTop = chatBox.scrollHeight;
}

安全性考虑

实现基本的输入过滤和验证。

js实现在线即时聊天

// 服务器端
socket.on('chat message', (msg) => {
    if (typeof msg !== 'string' || msg.length > 500) {
        return;
    }
    const filteredMsg = msg.replace(/<[^>]*>?/gm, '');
    io.emit('chat message', `${socket.nickname}: ${filteredMsg}`);
});

部署注意事项

生产环境需要考虑HTTPS、负载均衡和WebSocket连接持久化等问题。

标签: 在线js
分享给朋友:

相关文章

vue实现在线学习系统

vue实现在线学习系统

实现功能模块设计 在线学习系统通常需要包含课程展示、用户管理、学习进度跟踪、互动讨论等功能模块。使用Vue.js可以高效构建这些模块。 课程展示模块需要设计课程卡片、分类筛选、搜索功能。用户管理模块…

js实现轮播

js实现轮播

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

js实现密码

js实现密码

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

js 实现跳转

js 实现跳转

使用 window.location.href 进行跳转 通过修改 window.location.href 可以跳转到指定 URL,浏览器会加载新页面: window.location.hre…

js实现定位

js实现定位

使用Geolocation API获取当前位置 在JavaScript中,可以通过浏览器内置的Geolocation API获取用户的地理位置信息。该API需要用户授权才能访问位置数据。 if (n…

js实现排序

js实现排序

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