Socket.io 睡眠一些客户端

Posted

技术标签:

【中文标题】Socket.io 睡眠一些客户端【英文标题】:Socket.io sleep some client 【发布时间】:2016-01-17 20:33:56 【问题描述】:

我有一个 socket.io 应用程序。有没有办法在不断开连接的情况下临时锁定连接(只有一个连接)一段时间(比如 30 秒)。我想要做的是,在客户端触发事件后,我希望在 30 秒之前不再触发该事件。顺便说一句,由于项目限制,我无法在客户端执行此操作。

【问题讨论】:

【参考方案1】:

首先我不知道服务器端有任何限制,但它也可能影响客户端,但基本上你应该创建一个房间,然后你必须指定哪个房间获取套接字消息。您可以创建 activeRoomsuspendedClients 之类的(房间命名完全作为示例)。

然后你可以指定房间发送消息。为特定用户创建 30 秒计时;获取他的 socketId 并将其倒计时时间 30 设置为 json 对象。

// Multiple Clients may be suspended , use case ?.
var suspendedClients = [
  socketId: 123981787,
  countdown: 30
,
  socketId: 987987788,
  countdown: 21
];
// That users are also in suspendedClients room so they can't get messages.
// Also you might use redis to store them(?. if there is no restrictions about to use a new datastore).

您可以检查setInterval 函数每秒暂停的客户端。

if(suspendedClients[i].countdown == 0) 
   // Remove client from suspendedClients room.

这个想法是一个普遍的概念。您可以根据自己的具体要求塑造这个想法。

【讨论】:

【参考方案2】:

Socket.io 并没有这个功能。但你可以通过多种方式对其进行编码

在任何情况下,您都需要停止发送该事件或停止接收

如果无法修改客户端,只需将socket.id 保存在stopped 的数组中,然后setTimeout 30 秒即可将其从数组中拉出

subscribe / unsubscribe 听众的另一种方法 How to unsubscribe from a socket.io subscription?

我认为你可以使用房间来实现这种逻辑。

一个房间中的所有套接字和该房间的所有侦听器发送/接收 事件触发后,您为套接字留出空间 30 秒后你再次加入它

【讨论】:

以上是关于Socket.io 睡眠一些客户端的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io:命名空间、通道和合作

CloudFlare 和 socket.io

没有http服务器的Socket.IO?

如何从客户端断开和重新连接 socket.io?

socket.io 发出数据将断开客户端

socket io v1 中房间内的客户端数量