WebSocket 是一种全双工协议,用于在浏览器和服务器之间建立长时间的连接,可以实现实时通信。在前端开发中,我们经常需要使用 WebSocket 构建实时通信功能,比如聊天室、多人在线游戏等。本文介绍如何使用 Fastify 和 Autobahn.js 构建一个简单的 WebSocket API。
Fastify 简介
Fastify 是一个快速、低开销和高度可扩展的 Web 框架,它构建在 Node.js 上。Fastify 使用了一些优秀的工具和库,如 Node.js 中的异步 I/O、Stream 和 EventEmitter,以及 Google 的 V8 引擎和 libuv 线程池。Fastify 支持大量的插件,可以轻松地实现各种功能,如路由、缓存、验证等。
Autobahn.js 简介
Autobahn.js 是一个用于 WebSocket 和 RPC 的 JavaScript 库。它实现了 WebSocket 协议和 WAMP 协议,可以更方便地实现实时通信功能。Autobahn.js 支持 Node.js 和浏览器环境,可以轻松地构建 WebSocket 应用程序。
构建 WebSocket API
下面我们以一个简单的聊天室为例,介绍如何使用 Fastify 和 Autobahn.js 构建一个 WebSocket API。
安装依赖
首先,我们需要安装 Fastify 和 Autobahn.js:
npm install fastify autobahn
创建 Fastify 实例
在 index.js 中,我们创建一个 Fastify 实例,并启动它:
const fastify = require('fastify')() fastify.listen(3000, (err) => { if (err) { console.error(err) process.exit(1) } console.log('Server listening on http://localhost:3000') })
添加 WebSocket 路由
Fastify 支持 WebSocket 路由,我们可以使用 fastify.websocket
方法添加一个 WebSocket 路由:
const fastify = require('fastify')() fastify.websocket('/chat', (connection, req) => { console.log('Client connected.') })
这里我们添加了 /chat
路由,当客户端连接时,会触发回调函数,并传入客户端连接的 WebSocket 对象和请求对象。
发送和接收消息
在回调函数中,我们可以监听 WebSocket 的 onMessage
事件,用于接收客户端发送的消息:
const fastify = require('fastify')() fastify.websocket('/chat', (connection, req) => { console.log('Client connected.') connection.on('message', (message) => { console.log(`Received message: ${message}.`) }) })
我们可以在 onMessage
的回调函数中处理客户端发送的消息,在这里打印日志。
接下来,我们需要向客户端发送消息。我们可以在 onMessage
的回调函数中使用 send
方法发送消息:
const fastify = require('fastify')() fastify.websocket('/chat', (connection, req) => { console.log('Client connected.') connection.on('message', (message) => { console.log(`Received message: ${message}.`) connection.send(`You said: ${message}`) }) })
在这里,我们使用 send
方法向客户端发送一条消息。
使用 Autobahn.js 进行通信
Autobahn.js 封装了 WebSocket 和 WAMP 协议,可以更方便地实现实时通信功能。我们可以使用 Autobahn.js 的 Connection
类建立 WebSocket 连接:
const autobahn = require('autobahn') const connection = new autobahn.Connection({ url: 'ws://localhost:3000/chat', realm: 'realm1' }) connection.onopen = (session) => { console.log('Connection established.') } connection.open()
在这里,我们创建了一个 Connection
对象,传入 WebSocket 的 URL 和 WAMP 的 realm,然后打开连接。当连接建立完成后,会触发 onopen
回调函数,并传入一个 Session
对象。
我们可以在 Session
对象上调用 publish
方法来发布消息:
const autobahn = require('autobahn') const connection = new autobahn.Connection({ url: 'ws://localhost:3000/chat', realm: 'realm1' }) connection.onopen = (session) => { console.log('Connection established.') session.publish('room1', 'Hello, everyone!') } connection.open()
在这里,我们在 Session
对象上调用 publish
方法,传入一个主题和一条消息,用于发布到服务端。客户端可以使用 subscribe
方法订阅主题,接收发布的消息:
const autobahn = require('autobahn') const connection = new autobahn.Connection({ url: 'ws://localhost:3000/chat', realm: 'realm1' }) connection.onopen = (session) => { console.log('Connection established.') session.subscribe('room1', (message) => { console.log(`Received message: ${message}.`) }) } connection.open()
在这里,我们使用 subscribe
方法订阅 room1
主题,传入一个回调函数,用于接收消息。当有消息发布到主题时,会触发回调函数,并传入消息。
完整示例代码
const fastify = require('fastify')() const autobahn = require('autobahn') fastify.websocket('/chat', (connection, req) => { console.log('Client connected.') connection.on('message', (message) => { console.log(`Received message: ${message}.`) connection.send(`You said: ${message}`) }) }) fastify.listen(3000, (err) => { if (err) { console.error(err) process.exit(1) } console.log('Server listening on http://localhost:3000') }) const connection = new autobahn.Connection({ url: 'ws://localhost:3000/chat', realm: 'realm1' }) connection.onopen = (session) => { console.log('Connection established.') session.publish('room1', 'Hello, everyone!') session.subscribe('room1', (message) => { console.log(`Received message: ${message}.`) }) } connection.open()
总结
使用 Fastify 和 Autobahn.js 构建 WebSocket API 可以更方便地实现实时通信功能。Fastify 提供了 WebSocket 路由,可以轻松地创建 WebSocket API。Autobahn.js 封装了 WebSocket 和 WAMP 协议,可以更方便地实现实时通信功能。使用 Autobahn.js 的 Session
对象,可以轻松地实现发布和订阅功能。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65b63f80add4f0e0ffeee318