JS 中怎么用 WebSocket 实现一个实时聊天室网页应用

风浩同学_6955

风浩同学_6955

2026-11-04

812人浏览

原创

WebSocket实时聊天室核心是建立浏览器与服务器间的双向低延迟通信:服务端用Node.js+ws库管理连接与广播,客户端用原生API处理连接、收发与渲染,并需补充状态提示、回车发送、JSON消息格式及简易重连等体验优化。

js 中怎么用 websocket 实现一个实时聊天室网页应用

用 WebSocket 实现一个实时聊天室,核心是建立浏览器与服务器之间的双向、低延迟通信通道。关键不在于写多少代码,而在于理清客户端和服务器两端的职责分工:客户端负责连接、发消息、收消息、渲染;服务端负责接受连接、广播消息、管理用户(可选)。下面分步说明实际开发中必须处理的要点。

一、服务端:用 Node.js + ws 库快速搭建 WebSocket 服务器

推荐轻量库 ws(比 Socket.IO 更贴近原生协议,适合学习和可控场景):

  • 安装:npm install ws
  • 创建 server.js,监听连接、存储客户端、广播消息:

(注意:真实项目需加错误处理、心跳、连接数限制等)

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });

const clients = new Set();

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

  // 收到消息时,转发给所有其他用户(含自己,或按需过滤)
  ws.on('message', (data) => {
    const msg = data.toString();
    clients.forEach(client => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(msg);
      }
    });
  });

  // 断开连接时清理
  ws.on('close', () => {
    clients.delete(ws);
    console.log('用户断开');
  });
});

二、客户端:用原生 WebSocket API 连接并交互

HTML 页面只需基础结构(输入框、发送按钮、消息列表),JS 负责逻辑:

jm-jsjkxyjs02-zlm-405
jm-jsjkxyjs02-zlm-405

使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。

下载
  • 使用 new WebSocket('ws://localhost:8080') 建立连接
  • 监听 open 事件确认连接成功,再允许发送
  • 监听 message 事件接收服务器广播的消息,动态插入 DOM
  • 点击发送时,调用 ws.send(),并确保连接处于 OPEN 状态

示例关键 JS 片段:

const ws = new WebSocket('ws://localhost:8080');

ws.onopen = () => {
  console.log('已连接到聊天室');
};

ws.onmessage = (event) => {
  const msg = event.data;
  const li = document.createElement('li');
  li.textContent = msg;
  document.getElementById('messages').appendChild(li);
  document.getElementById('messages').scrollTop = document.getElementById('messages').scrollHeight;
};

document.getElementById('sendBtn').onclick = () => {
  const input = document.getElementById('msgInput');
  if (ws.readyState === WebSocket.OPEN && input.value.trim()) {
    ws.send(input.value.trim());
    input.value = '';
  }
};

三、增强体验:简单但必要的改进点

纯“发-播-收”只是骨架,加几处小改动就能明显提升可用性:

  • 显示连接状态:在页面顶部加提示文字,根据 ws.readyState(0=CONNECTING, 1=OPEN, 2=CLOSING, 3=CLOSED)实时更新
  • 支持回车发送:监听输入框的 keypress,keyCode === 13 时触发发送
  • 基础消息格式:不要只传纯文本。建议用 JSON,例如 {"user":"张三","text":"你好","time":"2024-05-20T10:30:00"},方便后续扩展用户名、时间戳、头像等
  • 自动重连(简易版):监听 onclose 或 onerror,延时后尝试新建 WebSocket 实例重连(生产环境建议用指数退避)

四、注意事项与常见坑

WebSocket 不是 HTTP,很多习惯要调整:

  • 跨域不是问题:WebSocket 协议本身不受同源策略限制(但服务端可校验 Origin 头做简单防护)
  • 不能直接用 localhost 域名访问 HTTPS 页面:若网页是 https://xxx.com,WebSocket 地址必须是 wss://(需配 SSL 证书),否则浏览器会拒绝连接
  • 消息是字符串或 ArrayBuffer:ws.send() 只接受字符串或二进制数据,传对象要先 JSON.stringify()
  • 服务端不保存历史:WebSocket 连接断开即丢失上下文,如需消息持久化,必须额外接入数据库或 Redis

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

5546

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1349

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

5464

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

1020

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1976

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

3825

4

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

2023.09.12

5013

6

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

2023.09.20

3300

5

java访问控制修饰符介绍
java访问控制修饰符介绍

java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

2023.09.20

1048

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习