前言
Socket.io 是前端开发中十分重要的一个库,它是实现了 Websocket 协议的 JavaScript 库,能够在客户端与服务端之间实现实时通讯。在 Socket.io 中,一个 Namespace(空间)对应着一个独立的连接池,具有独立的事件及数据传输通道。
Namespace 概述
在 Socket.io 中,Socket 可以通过定义 Namespace 来区分不同的连接池。一个 Namespace 对应着一个独立的连接池,具有独立的事件及数据传输通道,可以在不同的命名空间下传输不同的数据,实现逻辑分离。
一个 Namespace 对应着一个字符串,表示一个命名空间。
const io = require('socket.io'); const server = http.createServer(app); // 创建一个命名空间 const nsp = io.of('/my-namespace');
当客户端想要连接这个命名空间时,它需要使用以下方式连接:
const socket = io('/my-namespace');
这里需要注意一点,即连接的地址必须包含命名空间的名称。例如上面的例子,地址应该是 http(s)://hostname/my-namespace
而不是 http(s)://hostname
。
如何使用 Namespace
监听事件
在对应的 Namespace 上,可以使用 on 方法监听事件:
nsp.on('connection', (socket) => { console.log('Client connected to namespace!'); });
一旦有客户端连接到当前的命名空间,该方法就会被触发。
发送事件
当需要向当前 Namespace 中的所有客户端发送事件时,可以这么做:
nsp.emit('event', data);
当需要向当前 Namespace 中的所有客户端发送除发起请求的客户端之外的客户端事件时,可以这样使用:
socket.broadcast.emit('event', data);
当需要向除当前 Namespace 之外的 Namespace 发送事件时,可以使用 io 对象:
io.emit('event', data);
应用场景
通过 Namespace,我们可以在 Socket.io 实现多个不同类型的聊天室,或者分别实现不同类型的游戏模式。
例如,在使用 Socket.io 进行多人游戏时,每个游戏房间应该对应一个 Namespace。玩家连接到该 Namespace 时,服务器会将其加入到对应的游戏房间,从而实现玩家间的游戏通信。
接下来通过示例代码,进一步了解 Namespace 的应用场景。
多人聊天室
-- -------------------- ---- ------- -- -------- ----- -- - --------------------- ----- ------ - ----------------------- ----- --------- - ----------------- ----- ---------- - ------------------ -- ---------------- -------------------------- -------- -- - ------------------- ---- ------ ------------- -- -------------- --------------------- ------ -- - ----------------------------- ------ --- --- --------------------------- -------- -- - -------------------- ---- ------ ------------- -- -------------- --------------------- ------ -- - ------------------------------ ------ --- ---
在客户端连接时,创建命名空间并监听事件。当客户端连接成功时会打印日志。
当监听到“send_msg”事件,将通过当前命名空间将接收到的信息发送给所有客户端。
-- -------------------- ---- ------- -- -------- ----- ------------ - -------------- ----- ------------- - --------------- -- ------------- -------------------------- -- -- - ------------------- ---- ------------- --- --------------------------- -- -- - -------------------- ---- ------------- --- -- ----------------- ------------------------------ ------ -- - ------------------- ---- ---------- ------ --- ------------------------------- ------ -- - -------------------- ---- ---------- ------ ---
在客户端连接成功后,创建对应的 Namespace,监听“connect”事件。当监听到“receive_msg”事件,将接收到的消息打印出来。
多人游戏
-- -------------------- ---- ------- -- -------- ----- -- - --------------------- ----- ------ - ----------------------- -- ------ ----- --- - --------------- -- ---------------- -------------------- -------- -- - ----------------- ------ ------------- -- ---------------- ----------------------- ------ -- - -------------------------------------- ------ -------- --- ---
在客户端连接时,创建命名空间并监听事件。当客户端连接成功时会打印日志。
当监听到“send_state”事件,通过当前命名空间将接收到的信息发送给其他客户端。
-- -------------------- ---- ------- -- -------- ----- ------ - ------------ -- ------------- -------------------- -- -- - ----------------- ------------- --- -- ------------------- -------------------------- ------ -- - ----------------- -------- ------ ---
在客户端连接成功后,创建对应的 Namespace,监听“cennet”事件。当监听到“receive_state”事件,将接收到的状态信息打印出来。
总结
通过 Namespace,我们可以将客户端分成不同的组,每个组可以独立进行数据传输及处理。
通过上面的示例代码,可以看出 Namespace 的具体实现方式。
在前端开发中,Socket.io 的应用越来越广泛,使用命名空间是一种规范的优秀实践,有助于我们构建更复杂的应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ae1d2a48841e9894a17b2e