Socket.io IO 命名空间的使用及应用场景

阅读时长 6 分钟读完

前言

Socket.io 是前端开发中十分重要的一个库,它是实现了 Websocket 协议的 JavaScript 库,能够在客户端与服务端之间实现实时通讯。在 Socket.io 中,一个 Namespace(空间)对应着一个独立的连接池,具有独立的事件及数据传输通道。

Namespace 概述

在 Socket.io 中,Socket 可以通过定义 Namespace 来区分不同的连接池。一个 Namespace 对应着一个独立的连接池,具有独立的事件及数据传输通道,可以在不同的命名空间下传输不同的数据,实现逻辑分离。

一个 Namespace 对应着一个字符串,表示一个命名空间。

当客户端想要连接这个命名空间时,它需要使用以下方式连接:

这里需要注意一点,即连接的地址必须包含命名空间的名称。例如上面的例子,地址应该是 http(s)://hostname/my-namespace 而不是 http(s)://hostname

如何使用 Namespace

监听事件

在对应的 Namespace 上,可以使用 on 方法监听事件:

一旦有客户端连接到当前的命名空间,该方法就会被触发。

发送事件

当需要向当前 Namespace 中的所有客户端发送事件时,可以这么做:

当需要向当前 Namespace 中的所有客户端发送除发起请求的客户端之外的客户端事件时,可以这样使用:

当需要向除当前 Namespace 之外的 Namespace 发送事件时,可以使用 io 对象:

应用场景

通过 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

纠错
反馈