【简易聊天室】使用 HTML、CSS、JavaScript 结合 WebSocket 技术实现

本人能力有限,如有错误之处,还望指正

要制作一个简易聊天室,我们可以使用 HTML、CSS、JavaScript 结合 WebSocket 技术实现。

以下是一个完整的实现方案,包含前端界面和后端服务:

源代码:https://pan.quark.cn/s/e7d47e664d46

百度网盘下载:聊天室

链接:https://pan.baidu.com/s/1ma4D42PJk01dtCFyuh5_3w?pwd=ichd 提取码:ichd

1. 前端实现(HTML + CSS + JavaScript)

创建 index.html 文件,实现聊天界面和客户端逻辑:

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>简易聊天室</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 0 auto;
            padding: 20px;
        }
        .chat-title {
            text-align: center;
            color: #333;
            margin-bottom: 20px;
        }
        #chat-container {
            border: 1px solid #ccc;
            border-radius: 5px;
            padding: 10px;
            height: 500px;
            display: flex;
            flex-direction: column;
        }
        #messages {
            flex: 1;
            overflow-y: auto;
            margin-bottom: 10px;
            padding: 10px;
            border: 1px solid #eee;
            border-radius: 4px;
        }
        .message {
            margin: 5px 0;
            padding: 8px;
            border-radius: 4px;
        }
        .other {
            background-color: #f0f0f0;
        }
        .self {
            background-color: #e1f5fe;
            text-align: right;
        }
        #input-area {
            display: flex;
            gap: 10px;
        }
        #username {
            width: 120px;
            padding: 8px;
            border: 1px solid #ccc;
            border-radius: 4px;
        }
        #message-input {
            flex: 1;
            padding: 8px;
            border: 1px solid #ccc;
            border-radius: 4px;
        }
        #send-btn {
            padding: 8px 16px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        #send-btn:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>
    <h1 class="chat-title">简易聊天室</h1> <!-- 标题 -->
    <div id="chat-container">
        <div id="messages"></div>
        <div id="input-area">
            <input type="text" id="username" placeholder="你的名字">
            <input type="text" id="message-input" placeholder="输入消息...">
            <button id="send-btn">发送</button>
        </div>
    </div>

    <script>
        // 连接WebSocket服务器(根据后端地址修改)
        const ws = new WebSocket('ws://localhost:8080');
        const messagesDiv = document.getElementById('messages');
        const usernameInput = document.getElementById('username');
        const messageInput = document.getElementById('message-input');
        const sendBtn = document.getElementById('send-btn');

        // 接收消息
        ws.onmessage = (event) => {
            const data = JSON.parse(event.data);
            const messageDiv = document.createElement('div');
            messageDiv.className = `message ${data.isSelf ? 'self' : 'other'}`;
            messageDiv.innerHTML = `<strong>${data.username}</strong>: ${data.content}`;
            messagesDiv.appendChild(messageDiv);
            // 滚动到底部
            messagesDiv.scrollTop = messagesDiv.scrollHeight;
        };

        // 发送消息
        function sendMessage() {
            const username = usernameInput.value.trim() || '匿名用户';
            const content = messageInput.value.trim();
            if (content) {
                ws.send(JSON.stringify({ username, content }));
                messageInput.value = '';
            }
        }

        // 绑定事件
        sendBtn.addEventListener('click', sendMessage);
        messageInput.addEventListener('keypress', (e) => {
            if (e.key === 'Enter') sendMessage();
        });

        // 连接状态提示
        ws.onopen = () => {
            console.log('连接成功');
        };

        ws.onclose = () => {
            console.log('连接关闭');
            alert('与服务器断开连接,请刷新页面重试');
        };

        ws.onerror = (error) => {
            console.error('连接错误:', error);
        };
    </script>
</body>
</html>

2. 后端实现(Node.js + WebSocket)

安装nodejs可以参考这篇文章:
https://blog.csdn.net/weixin_53197693/article/details/151796516?spm=1001.2014.3001.5501

创建服务器文件 server.js
javascript 复制代码
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

// 存储所有连接的客户端
const clients = new Set();

wss.on('connection', (ws) => {
    console.log('新客户端连接');
    clients.add(ws);

    // 接收客户端消息并转发给所有连接的客户端
    ws.on('message', (data) => {
        const message = JSON.parse(data.toString());
        // 向每个客户端发送消息(标记是否为自己发送)
        clients.forEach((client) => {
            if (client.readyState === WebSocket.OPEN) {
                client.send(JSON.stringify({
                    ...message,
                    isSelf: client === ws  // 标记是否为当前发送者
                }));
            }
        });
    });

    // 客户端断开连接时移除
    ws.on('close', () => {
        console.log('客户端断开连接');
        clients.delete(ws);
    });

    // 错误处理
    ws.on('error', (error) => {
        console.error('WebSocket错误:', error);
    });
});

console.log('WebSocket服务器运行在 ws://localhost:8080');

3. 运行聊天室

3.1把之前我分享的文件夹下载下来,或者自己新建文件,把文章中的代码copy过去。
3.2点击这里,输入cmd:

-->1

-->2

使用 Node.js 的 ws 库搭建 WebSocket 服务器,实现消息转发功能:

3.3 初始化+依赖安装

注意下路径中不要有中文,要不然npm init -y会报错。

bash 复制代码
npm init -y
bash 复制代码
npm install ws
3.4 启动服务器
  1. 启动后端服务器:

    bash 复制代码
    node server.js
  2. 打开 index.html 文件(可在多个浏览器窗口/标签页中打开,模拟多用户聊天)

  3. 输入用户名和消息,点击发送即可进行实时聊天

4. 功能说明

  • 支持多用户实时聊天
  • 区分自己和他人的消息(不同背景色)
  • 自动滚动到最新消息
  • 支持按 Enter 键发送消息
  • 未输入用户名时默认显示"匿名用户"

5. 关闭聊天

在键盘中数据Ctrl+C即可关闭,就是平时用的复制快捷键。

注意事项

内容仅供参考,本人能力有限,所提供信息可能不完全准确或适用所有情况。

相关推荐
SamsongSSS3 小时前
JavaScript逆向Vue处理事件和捕获错误的核心逻辑
前端·javascript·vue.js·逆向
桃子不吃李子3 小时前
一些工具的使用
javascript·mongodb·node.js
晴殇i5 小时前
DOM嵌套关系全解析:前端必备的4大判断方法与性能优化实战
前端·javascript·面试
字节拾光5 小时前
console.log 打印 DOM 后内容变了?核心原因是 “引用” 而非 “快照”
javascript
Asort6 小时前
React函数组件深度解析:从基础到最佳实践
前端·javascript·react.js
BBB努力学习程序设计6 小时前
网页布局必备技能:手把手教你实现优雅的纵向导航
前端·html
Justineo6 小时前
TemPad Dev:设计与实现
前端·javascript·css
AAA简单玩转程序设计6 小时前
救命!HTML按钮点了没反应?3分钟学会给网页“装脑子”
javascript·html
神秘的猪头6 小时前
浏览器是如何渲染 HTML/CSS/JS 页面的?——从代码到像素的完整流程
前端·javascript