前端聊天室

admin5个月前 (04-22)it知识321
<!DOCTYPE html>
<html>
<head>
  <title>Socket.IO 聊天室</title>
  <script src="https://cdn.socket.io/4.7.5/socket.io.min.js"></script>
  <style>
    .chat-box { height: 400px; border: 1px solid #ccc; overflow-y: auto; padding: 10px; }
    .message { margin: 8px 0; padding: 8px; border-radius: 4px; }
    .self { background: #e3f2fd; margin-left: 20%; }
    .others { background: #f5f5f5; margin-right: 20%; }
    #user-list { position: fixed; right: 20px; top: 20px; background: white; padding: 10px; border: 1px solid #ddd; }
  </style>
</head>
<body>
  <div id="user-list"></div>
  <div class="chat-box" id="chatBox"></div>
  <input type="text" id="messageInput" placeholder="输入消息..." style="width: 70%">
  <button onclick="sendMessage()">发送</button>
  <script>
    // 初始化连接
    const socket = io('wss://your-chat-server.com', {
      auth: { userId: localStorage.getItem('userId') || `user_${Date.now()}` },
      reconnectionAttempts: 3,
      transports: ['websocket']
    });
    // 消息发送函数
    function sendMessage() {
      const input = document.getElementById('messageInput');
      if (input.value.trim()) {
        socket.emit('chatMessage', {
          text: input.value,
          time: new Date().toISOString()
        });
        input.value = '';
      }
    }
    // 监听服务端消息
    socket.on('chatMessage', (msg) => {
      const isSelf = msg.userId === socket.auth.userId;
      const div = document.createElement('div');
      div.className = `message ${isSelf ? 'self' : 'others'}`;
      div.innerHTML = `<b>${msg.nickname}</b>: ${msg.text}<br><small>${new Date(msg.time).toLocaleTimeString()}</small>`;
      document.getElementById('chatBox').appendChild(div);
    });
    // 用户列表更新
    socket.on('userListUpdate', (users) => {
      document.getElementById('user-list').innerHTML = 
        `<h4>在线用户 (${users.length})</h4>` + 
        users.map(u => `<div>${u.nickname}</div>`).join('');
    });
    // 连接状态管理
    socket.on('connect', () => {
      console.log('已连接服务器');
      socket.emit('joinRoom', 'public');
    });
    socket.on('disconnect', () => {
      console.warn('连接已断开');
    });
    // 回车发送
    document.getElementById('messageInput').addEventListener('keypress', (e) => {
      if (e.key === 'Enter') sendMessage();
    });
  </script>
</body>
</html>

二、核心功能说明

  1. 连接配置

    • 自动生成用户 ID 并存储于 localStorage

    • 优先使用 WebSocket 协议,失败后自动重连

  2. 消息交互

    • 支持文本消息发送与格式化时间显示

    • 消息气泡区分自己/他人(CSS 样式控制)

  3. 状态管理

    • 实时更新在线用户列表

    • 自动加入默认公共聊天室 public


三、服务端需配合实现

虽然此示例为纯前端代码,但需服务端支持以下逻辑:

  1. 处理 joinRoom 事件管理房间

  2. 广播 chatMessage 到同一房间用户

  3. 维护用户连接状态并推送 userListUpdate


四、扩展建议

  1. 历史记录
    添加 localStorage 缓存最近的 100 条消息

  2. 文件传输
    通过 socket.emit('fileUpload', base64Data) 实现(需服务端支持)

  3. 心跳检测
    增加 setInterval 发送心跳包维持连接


标签: 分享IT知识

相关文章

敏捷开发

敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可...

马斯洛理论

生理需求是最低层次的需求,包括人类维持自身生存的最基本要求,包括饥、渴、衣、住、性、健康方面的需求。安全需求包括两个层次,一是归属的需要,即人都有一种归属于一个群体的感情,希望成为群体中的一员,并相互...

故事分解结构

故事分解结构是一种用于分析、设计和编写故事的方法,它可以将故事分解为不同的层次,从而更好地理解故事的内在逻辑和结构。下面是故事分解结构的详细解释:节拍(beat):是故事的最小单位,包含动作和反应两个...

收集需求

在一个阳光明媚的周末,一家软件开发公司决定为他们的产品添加新功能。产品经理决定召集团队成员进行一次需求收集会议,以便更好地了解用户需求并为未来的开发做好准备。会议当天,团队成员聚集在会议室,桌上放着一...

如果百度不收录,如何提高网站人气

假设你是一个新兴的瑜伽品牌,你创建了一个网站来宣传你的瑜伽课程和品牌。然而,你发现百度搜索引擎并没有收录你的网站,这导致你的网站流量和人气较低。以下是你可以采取的一些策略来提高网站人气:优化网站结构:...

国庆节快乐

在这个特殊的日子里,让我们共同庆祝中华人民共和国的生日。红旗飘扬在空中,礼炮声回荡在城市中,举国欢庆。我们爱我们的国家,因为它是我们温暖的家园,我们成长的摇篮。国庆节是我国的法定节假日,这是一个金色的...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。