在Web前端开发中,我们常常需要使用到各种JavaScript库或框架,而这些库或框架中的组件往往需要支持服务端的数据接口,这时候就需要使用到一些连接两端的桥梁。ejov-connect就是其中非常实用的一种。
1. ejov-connect介绍
ejov-connect是一个基于Node.js平台的中间件,它作为一个连接两端的通信桥梁,充分利用websocket长连接技术,提供了一种简单的API,实现了前端和后端的交互。
ejov-connect具有以下特性:
- 支持websocket、HTTP协议的长连接、短连接。
- 支持事件上报、接收的实时性。
- 支持自定义协议,方便扩展。
- 支持授权验证、状态监控。
2. ejov-connect安装与使用
使用npm命令行工具,我们可以很方便地将ejov-connect安装到我们的项目中。
npm install ejov-connect
安装完成后,我们就可以在项目中使用ejov-connect了。
const ejovConnect = require('ejov-connect'); const app = require('express')(); app.use(ejovConnect());
上述代码中,我们先引入了ejov-connect,并将其赋给了ejovConnect。接着使用express的use方法,将ejovConnect作为中间件插入到应用程序中,这样我们就完成了ejov-connect的安装与使用。
接下来,我们将讲解ejov-connect的核心API。
3. ejov-connect使用示例
ejov-connect提供了一系列API,方便我们实现前后端的交互。现在我们将通过一个实例来演示它的使用方法。
在这个示例中,我们将需要用到ejov-connect作为服务端的通讯桥梁,同时我们还需要使用一个WebSocket客户端来进行测试。
3.1 服务端示例
以下是一个完整的node.js服务端示例,它使用ejov-connect来实现客户端和服务端之间的通信,将客户端发送的消息转发给所有连接的客户端。
-- -------------------- ---- ------- ----- ----------- - ------------------------ ----- --- - --------------------- ----------------------- ----------- ---- ---- -- - ---------------- --- -- - ------------------------ ----- ------ --------------------------- --- ------------------- ------------- --- ---------------- -- -- - ------------------- ----- -- ------------------------ ---
3.2 WebSocket客户端示例
在我们使用前端框架时,通常会与服务器交互。以下是一个基于WebSocket的简单客户端,它首先向服务器发送了一条消息,然后在接收到服务端回应之后,再将服务器发送的消息打印出来。
-- -------------------- ---- ------- ----- -- - --- ---------------------------------- --------- - -- -- - ---------------------- ------------- -------------- ---------- -- ------------ - --- -- - ------------------------ ---------- --
现在我们可以启动服务端代码,并运行WebSocket客户端代码了。如果一切正常,你会看到客户端会输出“Received: Hello Server!”。
4. ejov-connect的使用指南与深度解析
4.1 ejovConnect(options)
我们只需要在Node.js应用程序中添加app.use(ejovConnect(options))
即可启用ejov-connect的中间件。options
参数可选,它包含以下属性。
path
:WebSocket端点的URL,即要监听的URL,默认为/websocket
。serveClient
:指定是否提供客户端脚本,为true时客户端文件将从ejov-connect服务上的/socket.io/socket.io.js
获取,否则需要手动提供。默认为true
。pingInterval
:每隔pingInterval
毫秒向客户端发送心跳包以保持连接。默认值为25000。pingTimeout
:在pingTimeout
毫秒没有收到客户端的响应时断开连接。默认值为60000。cookie
:启用cookie以允许服务器从中获取到客户端身份。默认情况下禁用cookie。
4.2 namespace
和socket
namespace
是可以连接到的分离的传输通道,类似于命名空间。默认情况下,客户端总是连接到/命名空间/
下。一个namespace
会有一个socket
列表,用于存储连接到该namespace
下的所有socket
。因此,可以将socket
看作是连接到某个namespace
下的客户端对象。
当连接建立时,每个socket
对象将用一个唯一的ID(GUID)进行标识。可以通过socket.id
访问socket
的ID。
namespace
对象提供了以下方法。
4.2.1 on(event, callback)
通过on
方法,我们可以为namespace
对象添加一个回调函数,用于监听某一个事件(如connection
、disconnect
)。当有与客户端的socket
连接或断开连接时,将会触发此事件。
-- -------------------- ---- ------- ----- ----------- - ------------------------------- ---------------------------- ------ -- - -- -------- --- ---------------------------- ------ -- - -- -------- ---
4.2.2 emit(event, ...args)
emit
方法用于向所有连接到namespace
下的客户端发送一个事件。它将一个事件名和一些数据作为参数来调用,如果您只想向一个客户端发送数据,请使用socket.emit()
方法代替。
myNamespace.emit('event_name', {param1: value, param2: value});
4.2.3 to(room)
to
方法可以用于将消息发送给特定的房间,房间是单个客户端的任意聚集,你可以随时加入和离开房间。
const myRoom = ejovConnect.of('/myNamespace').to('room_name'); myRoom.emit('event_name', {param1: value, param2: value});
4.2.4 join(room)
join
方法让socket
加入指定的房间,在房间名相同的情况下,多次调用join
不会增加client在房间中的数量。
4.2.5 leave(room)
leave
方法从socket中删除指定的房间,如果不在房间中,这个方法调用没有影响。
4.3 socket
对象
当客户端连接时,服务器将为该客户端创建一个socket
对象。socket
对象表示一个活跃的WebSocket连接,它可以在客户端和服务器之间交换任意数据。
常用socket
的方法如下。
4.3.1 on(event,callback)
当从客户端收到指定的event时,会触发回调函数callback,callback接收一个data参数数据,数据可以是字符串或者 Buffer 对象。
socket.on('event_name', data => { // 回调处理 });
4.3.2 emit(event, ...args)
emit
方法让socket
向此客户端(self)或所有已连接到特定命名空间(broadcast)的所有客户端发送一个特定事件。此方法接收事件名和一些可选数据作为参数,如果要向其他客户端发送消息,则需要在方法后添加回调函数,以便在所有其他客户端已经接收到消息之后,返回一个应答消息。
socket.emit('event_name', {param1: value, param2: value});
4.3.3 broadcast.emit(event, ...args)
broadcast.emit
方法让socket
向所有其他连接到该命名空间的客户端广播一个事件。broadcast.emit
是将一个事件名和一些可选择的数据作为参数,只会广播到没有将此数据的响应监听器注册到该 namespace 下的客户端。
socket.broadcast.emit('event_name', {param1: value, param2: value});
4.3.4 disconnect()
disconnect()
方法用于关闭socket和远程客户端之间的连接。
4.4 多命名空间
可以通过 ejovConnect.server 来创建立即自己的命名空间,通过在其上注册的回调函数完成命名空间的聚合处理,管理多个命名空间。
下面代码展示创建多个命名空间的简单示例。
-- -------------------- ---- ------- ----- ----------- - ------------------------ ----- --- - --------------------- ----- ------ - ---------------------------------- ----- -- - -------------------- ----- ---- - --------------- ----- ---- - --------------- --------------------- ------ -- - ---------------------- - -------- -------- -- ------ --- --- --------------------- ------ -- - ---------------------- - -------- -------- -- ------ --- --- --------------------
本示例创建了两个命名空间,分别是chat和news。通过on()方法监听connection事件,一旦新连接建立,就可以执行相应的操作。
4.5 私有通信
私有通信是我们经常需要用到的。在ejov-connect中,可以使用socket.join(room)
和socket.leave(room)
方法将客户端加入到房间中,然后使用io.to(room)
来向房间中的所有客户端广播消息。
在以下示例中,我创建了两个房间room1和room2,向其加入了不同的客户端。使用io.to(room_name).emit()
向指定的房间中的所有客户端广播消息。
-- -------------------- ---- ------- ----- ----------- - ------------------------ ----- --- - --------------------- ----- ------ - ---------------------------------- ----- -- - -------------------- ------------ ----- ---- -- - ---------------------- - --------------- --- ------------------- ------ -- - ------------------------- ----------- -- -- ----- -- --------------------- ----------------- -------- ----------- -- -- ----- -- --------------------- ----------------- -------- ----------- -- ------------------- --------------------------------- --------- ------ ---------- -- ------------------- --------------------------------- --------- ------ ---------- -- ---------- --------------------- --------- ------ ------------- --- --------------------
4.6 验证
当使用websocket进行连接时,我们需要对客户端进行身份验证。ejov-connect提供了身份验证的方法。
验证方法如下:
-- -------------------- ---- ------- ----- -- - -------------------- ------------------- ------ -- - ------------------------- ----------- -- ----- ----------------- ----------- -- - -- ------------------------------- - ------------------- ----------------- - ---- - ------------------- -------------- ---------- - --- --- -------- ----------------------------- - -- -------- ------ ----- -
当客户端连接服务器时,可以使用socket.emit('auth', data)方法对其进行身份验证。如果验证无误,则表示客户端鉴权成功。
4.7 心跳
在进行长连接时,为了保持长连接的稳定,需要使用心跳。ejov-connect提供了心跳机制,用于在客户端和服务端之间保持连接。
如下是使用心跳机制的示例代码:
const io = ejovConnect(server); io.set('heartbeat interval', 5000); // 5秒钟之后开始发送心跳请求 io.set('heartbeat timeout', 15000); // 15秒钟内未能从客户端收到任何消息,即断开连接 io.on('connection', socket => { console.log('Connected:', socket.id); });
在上面的代码中,我们使用set()方法来设置心跳机制的参数。‘heartbeat interval’表示要求客户端每隔5秒向服务器发送一次心跳请求,而‘heartbeat timeout’表示如果服务器在15秒内没有收到任何消息,则断开与客户端的连接。
5. 小结
本文介绍了ejov-connect的特点、安装与使用方法以及常用API。ejov-connect是一款优秀的Node.js中间件,它能帮助我们轻松地搭建WebSocket服务,实现前后端的实时通信。掌握ejov-connect的使用方法,有助于我们开发更强大的实时Web应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055f1c81e8991b448dcb4e