【问题标题】:How to send events to a single client with pusher pubnub socketio如何使用 pusher pubnub socketio 向单个客户端发送事件
【发布时间】:2014-09-18 01:03:03
【问题描述】:

我正在构建一个多人回合制游戏,客户端和服务器之间的通信是通过Pusher 建立的。我可以使用游戏频道向所有客户端发送事件。问题是如何向单个客户端发送事件? Pusher 没有它的文档,只有看似解决方案是使用authenticated channels。为每个向单个客户端发送事件的客户端验证专用通道是否可行,还是有更好的解决方案?

【问题讨论】:

  • 您可以随数据一起发送一个 ID,然后在客户端事件处理程序上检查正确的 ID,如果与客户端无关则忽略。每个客户端使用一个频道会很昂贵且复杂。
  • @dandavis,向每个人发送不相关的数据会很昂贵。 socket.io 有一种发送到特定套接字的简单方法,我该如何使用 Pusher 呢?
  • 这些服务是为广播而设计的,因此它们可以扩展超出 socket.io 在单个线程上可以轻松完成的工作。根本没有“单一客户端”发射/发送/广播功能,所以你必须做其他事情。许多渠道是一种选择,客户端过滤是另一种选择。如果您更关心带宽而不是延迟,则出现第三种选择:您向所有人发送带有 id 的更改通知,并且具有正确 id 的客户端执行 ajax 调用以获取私有数据。这可以让您的信号管道不被大量或私人数据弄得一团糟,但确实会增加几十毫秒的延迟......
  • 我必须向每个玩家发送他们的卡片,因此必须进行身份验证,@dandavis 的最佳解决方案是什么
  • 您需要服务器知道的客户端密码,并且永远不要通过套接字发送。 “详细信息” ajax 调用应根据需要将 eventID、clientID 和客户端密码传递给服务器,如果它们符合服务器的期望,则在 ajax 响应中返回数据。

标签: javascript ruby-on-rails node.js pusher pubnub


【解决方案1】:

您在回答中提到了最佳解决方案。您应该能够非常轻松地以编程方式为每个用户设置频道,然后通过这些频道向他们广播消息。

例如(这是一个 Ruby 示例,但应该清楚发生了什么)

user = SOME_USER_OBJECT
Pusher.trigger("card-data-#{user.id}", 'card-update', {data: {card_id: 1, status: 'used'})

或类似的东西。显然,您需要确保在客户端,用户订阅了正确的频道。

显然,如果您需要通道安全,那么正如您所说,您可以使用经过身份验证的通道 - 可能在您的情况下使用私有通道是有意义的。

如果您还有其他问题,可以再次在这里回复,我会看看,或者您可以发送电子邮件至support@pusher.com 支持。

【讨论】:

  • dandavis 建议这将是开销,我应该使用 Ajax 进行单一通信。也许是一种混合方法?您认为将频道专用于每个用户的数百万用户是否可行?
  • 我认为最好为每个用户创建一个频道,因为否则,正如您所提到的,您将向用户发送大量不适合他们的消息,因此基本上会被浪费.对于您或客户而言,开销没有区别,因为您只是触发了不同的频道,而客户仍然只订阅了一个(或您需要的任意多个)频道——它们恰好对每个用户都不同。这就是 Pusher 可以为您提供的帮助。您可以这样编码,而不必担心缩放 - 这是我们的问题:)
【解决方案2】:

您可以为每个客户订阅单独的事件,而不是创建单独的频道。

【讨论】:

    【解决方案3】:

    PubNub 流过滤器

    如果您使用的是 PubNub,您可以为每个用户创建一个唯一的频道并将正确的消息发布到每个频道,或者您可以为所有用户创建一个公共频道并使用流过滤器功能,以便每个客户端只在该频道上获得他们想要的消息。此过滤在服务器端执行,因此最终用户不会收到必须忽略的不需要的消息。

    这是使用流过滤器的简单高级步骤

    1. 在客户端初始化 PubNub 时,使用 meta 参数创建过滤器
    2. 当您发布消息时,将键/值添加到 meta 参数中,该参数将用于在 PubNub 网络上过滤消息,然后再将它们发送给订阅者(基于每个订阅者的过滤器)。

    对于每个 SDK 的完整流过滤器文档(您通过标签提到的):

    您还可以使用PubNub BLOCKS 将每条消息路由到适当的用户频道(或者您将频道映射到最终用户)before publish 事件处理程序。我不会详细介绍此内容,因为它涉及的内容稍微多一些,但如有必要,请随时询问其他见解。要开始使用,您可以查看完整的 BLOCKS docs

    【讨论】:

      猜你喜欢
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      相关资源
      最近更新 更多