【问题标题】:Meteor: Check how many clients are subscribed to a certain publish functionMeteor:检查有多少客户端订阅了某个发布功能
【发布时间】:2013-09-11 02:13:14
【问题描述】:

有没有办法检查当前订阅某个发布功能的客户端数量?问题是我有不同的组,每个组都有自己独特的ghash。 当用户选择离开一个组并进入一个新组时,这个 ghash 会发生变化,并且订阅了 THE SAME 发布功能,尽管当然使用了不同的ghash

所以我正在寻找一种方法来检查一次有多少客户端订阅了每个组/gash(在服务器端)。我整天都在摆弄this 之类的东西,但老实说它并没有那么好用。我也在监听套接字的“取消订阅”事件以及所有这些,但仍然......这都是地狱般的错误。

如果有人对我的整个代码感兴趣,你可以找到它here! (我发现它太长了,无法将其粘贴到我的帖子中。)

我真的希望有人可以提供帮助! :-)

干杯,P

编辑:或者换句话说:有没有办法计算当前连接到 sockjs websocket 的客户端数量,其中所有这些 websocket 都使用相同的参数调用?

================================================ ============================

编辑 2: 新版本:LINK

由于某种原因,这根本不起作用...没有插入,因为提供给订阅的 ghash 永远不等于任何实际的套接字订阅(--> 参见 lin 20: ghash is never equal to ghash2 )。我只是不明白这怎么可能?每次 Session ghash 更改时,都会调用整个订阅函数。这个 var 怎么可能永远不等于提交给实际套接字(提交)的参数? (它也总是一个 ghash,但总是另一个组的 ghash)。

我真的迷路了! :-(

【问题讨论】:

    标签: javascript sockets meteor publish-subscribe


    【解决方案1】:

    我现在看到您正在做直接的旧节点式 socket.io 编程。我在节点项目中做过类似的事情。这也许是真正的问题。在 Meteor 的文档中,他们甚至不使用套接字这个词。也许其他人会和你一起讨论这个新问题,但这个关于跟踪订阅者的问题由这个答案回答。

    我认为流星是一个新世界,如果你适应它的思维方式,它会为你处理这些事情。例如,制作一个消息集合,其中包含一个聊天室字段。每个客户选择他们的聊天室,找到那些messages.find({chatroom:'box5'}),并显示它们。一条新消息会自动发送给正在收听该聊天室的每个客户。让 Meteor 为您使用套接字。

    计算订阅某项内容的客户的答案:

    伪代码: 制作一个对象来保存每个订阅签名的计数 计数 = {}

    在注册时,创建一个唯一代表订阅的字符串,将其添加到您的计数对象中。 counts['params as string'] += 1;

    退出时 counts['params as string'] -= 1;

    知道什么时候仍然没有人订阅的逻辑是这样的: done = (0 == counts['params as string'])

    【讨论】:

    • 我很抱歉,但你能解释一下这个神秘的答案是什么意思吗?! ;) 没有任何文字,真正的代码 n 东西真的很难理解这个答案的意思!
    • 也许您可以使用 pastebins“创建此粘贴的新版本”功能并将您的代码放在那里?!
    • 这样更好吗?与其认为您可以计算它们,您还必须跟踪它们,并且计数是在跟踪中提供的。
    • 发布了一个新版本!请看我上面的帖子!我再次使用 Collection 而不是对象,因为我需要在其他地方访问它,但本质上我认为我的新解决方案就像你建议的那样,对吧?!
    • 是的,你所做的就像我的建议,但我还有其他意见。我修改了上面的答案。
    【解决方案2】:

    显然,据我所知,目前还不可能做到这一点。 我做了一些研究并尝试了很多东西,但由于某种原因,有时会打开多个 websocket 以将相同的数据传输到同一个客户端。 --> 通过这种方法计算连接的客户端数量是不可能的。 仅仅在我的ghash 更改时触发一个事件也不够好,因为关闭浏览器窗口不会触发它。

    我认为有一个功能来计算“查看相同数据更改”的客户端数量(想不出更好的表达方式)会很棒。也许一些流星核心开发人员可以把他/她的 2 美分放在这里,所以我们知道这是否可能。

    我希望有人能在某个时候提出解决方案.. 我做不到! :(

    【讨论】:

    【解决方案3】:

    我的用户状态包通过跟踪全局发布功能的订阅数量来跟踪连接到 Meteor 应用程序的客户端数量。你或许可以从中得到一些启发。它在每个出版物级别上并不精细,但您当然可以对您感兴趣的出版物做同样的事情。

    https://github.com/mizzao/meteor-user-status

    主要需要注意的是

    • 每个打开的会话都会调用订阅(用户可能打开了多个标签页)
    • 每次用户登录我们的out,订阅都会更新
    • 您可以在发布函数中读取每个会话的 ID
    • 您可以监听 SockJS 套接字的 close 事件以关闭浏览器选项卡等。

    我认为对团体来说这样做不会太难;我正在为另一个项目做同样的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 2015-09-04
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多