在现代 Web 应用中,实时通讯已经成为了必不可少的一部分。传统的轮询方式或者长连接方式已经不能满足应用的需求,这时候 WebSockets 成为了首选的方式。
Fastify 是一个高效的 Node.js Web 框架,它提供了良好的性能和易用性。在 Fastify 中使用 WebSocket 可以让我们更加方便地实现实时通讯功能。
WebSocket 概述
WebSocket 是一个基于 TCP 协议的全双工通信协议,在客户端和服务器建立连接后,可以双向传输数据。相较于传统的 HTTP 请求,WebSocket 的优势在于:
- 连接一次,数据传输多次。
- 实时性更高,数据传输更快。
- 可以使用更接近网络层的协议,减少了头部的大小,降低了网络负载。
Fastify-WebSocket
Fastify-WebSocket 是一个 Fastify 插件,可以方便地在 Fastify 中使用 WebSocket。它使用了 ws 库作为 WebSocket 的实现。
安装
使用 npm 进行安装:
npm install fastify-websocket
使用
在 Fastify 应用中注册 Fastify-WebSocket 插件:
const fastify = require('fastify')() fastify.register(require('fastify-websocket')) fastify.listen(3000, (err, address) => { if (err) throw err console.log(`server listening on ${address}`) })
Fastify-WebSocket 插件注册后,可以在 Fastify 的路由处理函数中使用 WebSocket 服务。
建立连接
在路由处理函数中,可以使用装饰器语法 request.websocket()
来创建 WebSocket 连接:
fastify.get('/chat', { websocket: true }, (connection, req) => { connection.socket.on('message', message => { // 处理消息 }) })
上面例子中,fastify.get()
方法创建了一个 GET 请求的路由,使用 websocket
参数启用 WebSocket 服务。在路由处理函数中,request.websocket()
方法创建了一个 WebSocket 连接,可以在回调函数中处理消息。
发送消息
WebSocket 连接建立后,可以使用 ws.send()
方法向客户端发送消息:
connection.socket.send('Hello, world!')
断开连接
当 WebSocket 连接关闭时,可以在连接对象 connection
上监听 close
事件:
connection.socket.on('close', (code, reason) => { console.log(`connection closed: ${code} ${reason}`) })
示例应用
为了演示 Fastify-WebSocket 的使用,我们创建一个 WebSocket 聊天应用。
前端
在前端,我们使用 WebSocket API 连接到服务器:
-- -------------------- ---- ------- --------- ----- ------ ------ ----- ---------------- ------------------- ------- ------ ------- ----- ------ ----------- ---------- -------- ------- ----------------------------- ---- --------- -------- -------------------- ---- ------ ----------- ------------ --------- ------- --------- ---------------------- -------- ----- ---- - ------------------------------- ----- ------- - ---------------------------------- ----- --- - ------------------------------ ----- ------- - ---------------------------------- ----- ---- - ------------------------------- --- -- --------------------------------- -- -- - -- --- -- ------------- --- --------------- - ------ - -- - --- ------------------------------------- --------------------------- -- -- - --------- -- -------------- ---------------- - ----- ------------- - ----- -- ------------------------------ ----- -- - --------- -- ----------------- -- ---------------------------- -- -- - --------- -- ----------------- ---------------- - ---- ------------- - ---- -- -- ------------------------------ -- -- - ----------------------- ------------------ ------------- - -- -- --------- ------- -------
在页面加载后,用户输入姓名,点击 Connect 按钮连接到服务器。当连接成功后,用户可以输入聊天内容并发送。
后端
在后端,我们创建一个路由处理 WebSocket 连接:
fastify.get('/chat', { websocket: true }, (connection, req) => { connection.socket.on('message', message => { fastify.websocketServer.clients.forEach(client => { client.send(message) }) }) })
上面代码中,WebSocket 连接建立后,我们在回调函数中监听 message
事件,收到消息后遍历 WebSocket 服务器中的所有客户端,使用 ws.send()
方法发送消息。
运行应用
在前端和后端代码放在同一个目录下,运行后端代码:
node app.js
打开浏览器访问 http://localhost:3000/chat.html,输入姓名并点击 Connect 按钮连接到服务器。当连接成功后,可以在界面下方输入聊天内容并发送。
结论
Fastify-WebSocket 可以方便地在 Fastify 应用中使用 WebSocket,帮助我们更加方便地实现实时通讯功能。通过上面的示例,我们可以掌握如何在 Fastify 中创建 WebSocket 服务,建立、发送消息和断开连接。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6736c1e50bc820c5825636be