简介
@maritz/garageserver.io 是一个基于 Node.js 的 WebSocket 实时通讯服务,支持多种协议 (ws, uws, socket.io) 和高并发的客户端连接,适用于实时共享数据、二进制数据传输、游戏等场景。
安装和引入
使用 npm 安装:
npm install @maritz/garageserver.io
引入 garageserver:
const garageserver = require('@maritz/garageserver.io');
创建 garageserver 实例
const garageserver = require('@maritz/garageserver.io'); const server = garageserver({ port: 3000, ws: true, uws: true, // 更多配置项 });
garageserver 实例详解
garageserver(options: garageserverOptions)
创建 garageserver 实例需要传入一个 options 对象,它可以包含以下属性:
- port: 监听的端口号。
- ws: 是否开启 WebSocket。
- uws: 是否开启 uWebSockets。
- path: WebSocket 构造函数的 path 参数。
- pathError: 路径错误时的响应函数。
- serveClient: 是否提供客户端文件。
- pingInterval: ping 客户端的间隔时间(毫秒)。
- pingTimeout: ping 超时时间(毫秒)。
- perMessageDeflate: 是否启用 PermessageDeflate 扩展。
- maxHttpBufferSize: HTTP 请求消息的最大大小。
- makeUpgradeReq: WebSocket 升级请求生成函数。
- beforeConnect: 在握手之前调用的函数。
- afterConnect: 在握手之后调用的函数。
- cors: 是否启用跨域资源共享。
- allowRequest: 允许请求的函数。
- httpCompression: 是否启用 http 压缩。
- cookie: 定义在客户端/服务器协商的会话中使用的 Cookie 名称。
- perMessageDeflateOptions: PermessageDeflate 扩展的选项。
- transports: 可用的传输方法(默认为 ['polling', 'websocket'])。
- allowUpgrades: 是否允许传输升级。
- maxHttpHeaderSize: HTTP 请求头部的最大大小。
- forceWebsockets: 强制使用 WebSocket 协议。
- httpCompressionOptions: http 压缩的选项。
garageserver.set
用于在 garageserver 实例上设置全局属性:
server.set('logger', myLogger);
garageserver.engine
设置 WebSocket 实现引擎的名称:
server.engine('ws', engine);
garageserver.on
监听 garageserver 实例的事件:
server.on('connection', socket => { console.log(`client ${socket.id} connected`); });
garageserver 实例的方法
garageserver.to (room: string): SocketNamespace
获取房间 room 的 SocketNamespace:
const room = garageserver.to('roomName');
garageserver.adapter
获取 garageserver 实例的适配器:
const adapter = garageserver.adapter();
garageserver.of (namespace: string): SocketNamespace
获取命名空间 namespace 的 SocketNamespace:
const namespace = garageserver.of('/myNamespace');
garageserver.emit
发送一个事件给全体 Socket:
garageserver.emit('newMessage', msg);
garageserver.close
关闭 garageserver 实例:
garageserver.close();
SocketNamespace 实例详解
SocketNamespace.clients
获取命名空间中所有 Socket 的数组。
SocketNamespace.emit
发送一个事件给命名空间内的所有 Socket:
namespace.emit('newMessage', msg);
SocketNamespace.connected
获取命名空间中所有连通的 Socket 的数组。
SocketNamespace.adapter
获取命名空间的适配器。
SocketNamespace.name
获取命名空间的名称。
SocketNamespace.use
在命名空间 Middleware 中使用函数:
namespace.use((socket, next) => { console.log(`socket ${socket.id} connected`); next(); });
socket 实例详解
socket.id
获取 socket 的唯一标识符。
socket.emit
发送一个事件给该 Socket:
socket.emit('newMessage', msg);
socket.join
加入房间:
socket.join('roomName');
socket.leave
离开房间:
socket.leave('roomName');
socket.disconnect
关闭该 Socket 的连接。
socket.to (room: string): SocketNamespace
获取房间 room 的 SocketNamespace。
socket.broadcast
发送一个事件给所有连接的 Socket,但该事件不包含当前的 Socket。
socket.broadcast.emit('newMessage', msg);
socket.rooms
获取当前 Socket 所在的房间。
示例代码
发送消息
-- -------------------- ---- ------- ----- ------------ - ----------------------------------- ----- ------ - -------------- ----- ---- --- ----------------------- ------ -- - ------------------- ------------ ------------ -------------------- --- -- - ------------------- ------------ - --------- --------------------- ------------- ----- --------- --- ---
加入和离开房间
-- -------------------- ---- ------- ----- ------------ - ----------------------------------- ----- ------ - -------------- ----- ---- --- --- -------- - -------- ----------------------- ------ -- - ------------------- ------------ ------------ ----------------- -- -- - ---------------------- ------------------- ------------ ------ -------------- --- ------------------ -- -- - ----------------------- ------------------- ------------ ---- -------------- --- -------------------- --- -- - ------------------- ------------ - --------- ---------------------------------- ------------- ----- --------- --- ---
使用 middleware
-- -------------------- ---- ------- ----- ------------ - ----------------------------------- ----- ------ - -------------- ----- ---- --- ------------------- ----- -- - ------------------------- ------------ ------- --- ----------------------- ------ -- - ----------------------- -- -- - ------------------------- --------------- --- -------------------- --- -- - ------------------- ------------ - --------- --------------------- ------------- ----- --------- --- ---
结语
@maritz/garageserver.io 对于实时通信和高并发连接场景下的 Node.js 后端开发,是一个不错的选择,相信大家能够快速上手并使用起来。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60066bca967216659e24462c