聊到聊天室,大家应该都不陌生。无论是早期的 IRC,还是如今的各类即时通讯工具,核心逻辑其实都差不多。之前也讨论过不少使用 Node.js 搭建聊天服务的案例,今天换一个角度,专门演示如何通过 WebSocket 实现一个高效实时的聊天服务器,帮助大家快速掌握 Node.js WebSocket 聊天室的开发流程。
之所以选择 WebSocket,是因为它天然支持全双工通信,非常适合实时聊天、在线协作等场景。Node.js 原生 API 虽然不直接提供 WebSocket 支持,但社区有非常成熟的第三方库,比如本文要使用的 ws(项目主页在 GitHub 上,搜索 websockets/ws 即可找到)。这个框架轻量、易用,不依赖其他环境,非常适合用来快速搭建 WebSocket 聊天服务器原型。
安装方式与其他 Node.js 包一样,一行命令即可完成:
npm install ws
安装完成后,创建 WebSocket 服务器非常简单。下面是一个基本示例,监听在 8080 端口:
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
服务器启动后,接下来要考虑聊天室的具体需求。这里实现一个经典的群聊模式:所有用户发送的消息,其他在线用户都能即时看到。当新用户连接时,服务器使用其 IP 和端口拼接作为临时昵称,方便区分不同的客户端。
服务器端的实现
理解了需求后,代码实现就顺理成章了。以下是完整的服务器端代码,展示了如何用 Node.js 和 ws 库构建一个 WebSocket 聊天服务器:
const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 8080 });
server.on('open', function open() {
console.log('connected');
});
server.on('close', function close() {
console.log('disconnected');
});
server.on('connection', function connection(ws, req) {
const ip = req.connection.remoteAddress;
const port = req.connection.remotePort;
const clientName = ip + ':' + port;
console.log('%s is connected', clientName);
// 发送欢迎信息给客户端
ws.send("Welcome " + clientName);
ws.on('message', function incoming(message) {
console.log('received: %s from %s', message, clientName);
// 广播消息给所有客户端
server.clients.forEach(function each(client) {
if (client.readyState === WebSocket.OPEN) {
client.send(clientName + " -> " + message);
}
});
});
});
核心逻辑非常直接:当服务器收到某个客户端发送的消息时,会遍历所有已连接的客户端,将消息加上发送者昵称后转发出去,从而实现群聊广播效果。
客户端的实现
客户端方面更简单——浏览器原生支持 WebSocket API,无需额外引入第三方库。使用 HTML + JavaScript 即可快速搭建交互页面。
下面是客户端 client.html 的完整代码:
WebSocket Chat
这里需要注意一点:WebSocket 的连接地址是 ws://localhost:8080/ws,路径部分需要与服务器端保持一致(服务器端未限制路径时默认接受所有请求,但客户端指定了路径,实际运行时直接连接 ws://localhost:8080 也是可行的。此处保留原意,不必深究)。
运行应用
先启动服务器:
node index.js
然后在浏览器中直接打开 client.html 文件,就能看到聊天界面了。

多开几个浏览器窗口,即可模拟多个用户同时在线聊天。每个人发送的消息,其他窗口都能即时收到,充分体现 WebSocket 的实时通信能力。

整个流程下来,核心逻辑其实只有几步:搭建 WebSocket 服务器、处理客户端连接、广播消息。WebSocket 让这一切变得非常流畅,而 Node.js 的非阻塞特性则保证了高并发下的性能表现。如果你有兴趣,完全可以在本示例的基础上扩展更多功能,例如用户昵称自定义、消息持久化存储、私聊等,打造一个功能完善的 Node.js 实时聊天应用。
