我可以使用单个Play WebSocket播放广播消息和私人消息吗?

Arjan

我需要向当前正在处理Play WebSocket消息的客户端发送一个私有响应,而对于其他消息,我需要向所有客户端广播响应。

在Play聊天示例中,传入消息立即被卸载到单个Actor上

case Connected(enumerator) => 
  // Create an Iteratee to consume the feed, assuming all requests have
  // a JSON "text" node, and delegate all to the Akka Actor:
  val iteratee = Iteratee.foreach[JsValue] { event =>
    default ! Talk(username, (event \ "text").as[String])
  }.map { _ =>
    default ! Quit(username)
  }
  (iteratee,enumerator)

上面,一旦连接被批准enumerator回传,这指的chatEnumerator是由同一Actor已经创建的单个

val (chatEnumerator, chatChannel) = Concurrent.broadcast[JsValue]

我认为这不允许我仅向单个客户端发送消息吗?我应该删除广播功能并为每个客户端创建并跟踪枚举数,然后自己进行迭代吗?还是可以通过某种方式获得对特定于客户的枚举数的引用foreach

(我的理解是内在的灵活性依赖于实现,但这种使用情况似乎相当普遍给我。使用使用WebSockets时就像Socket.IO,我可以很容易地发送消息要么所有客户,所有客户端除了当前的发送者请求或一个客户端。这也是我在Play 2.1.x中要实现的目标。)

单元

一种方法是使用交错两个枚举器Enumerator.interleave

因此,您可以创建两次(Enumerator, Channel)使用Concurrent.broadcast两次,一对用于广播,另一对用于私人连接,并进行交织。(或者可能仅Concurrent.unicast用于私有枚举器,但我不知道如何使用它。)

这是一些在play 2.3.0上可用的示例播放代码。

object Application extends Controller {
  val (publicOut,publicChannel) = Concurrent.broadcast[String]
  def chat = WebSocket.using[String]{ request =>
    val (privateOut,privateChannel) = Concurrent.broadcast[String]
    val in = Iteratee.foreach{
      msg:String => if(msg.startsWith("@")){
        publicChannel.push("Broadcasted: " + msg)
      }else{
        privateChannel.push("Private: " + msg)
      }
    }
    val out = Enumerator.interleave(publicOut,privateOut)
    (in, out)
  }
}

向特定客户端发送消息将有些复杂的代码,但是概念是相同的。创建一个Actor容纳(Enumerator, Channel)每个websocket的对,然后将消息发送给actor。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我可以使用 nginx 在单个端口中同时使用 http auth 和 sso 登录吗

来自分类Dev

我可以使用FileSystemObject使用其索引从文件夹中获取单个文件吗?

来自分类常见问题

我可以使用CSS为表格列着色而不给单个单元格着色吗?

来自分类Dev

我可以使用debdelta安装/更新单个软件包吗?

来自分类Dev

我可以使用Always Emplace替换单个元素插入的插入吗?

来自分类Dev

我可以使用单个Jsch Object打开多个通道吗?

来自分类Dev

我们可以使用单个指针实现双向链接列表吗?

来自分类Dev

我可以使用debdelta安装/更新单个软件包吗?

来自分类Dev

我可以使用单个Unix命令创建,设置权限并写入文件吗?

来自分类Dev

我可以使用批处理脚本取消隐藏单个文件夹或文件吗?

来自分类Dev

我可以使用LINQ查询两个列表以填充单个列表吗

来自分类Dev

我可以使用“包含”优化单个 linq 查询以预先加载查询元素吗

来自分类Dev

我可以使用单个触发器影响多个控件的属性吗?

来自分类Dev

我可以使用数组优化此代码以使其在单个循环中处理100页吗?

来自分类Dev

使用APNS广播单个消息

来自分类Dev

我可以使Intellij编译单个软件包吗?

来自分类Dev

我可以使用multer和单个html格式将许多文件上传到不同的文件夹中吗?

来自分类Dev

我的通知无法播放广播接收器

来自分类Dev

如何使用C#广播来自Websocket的消息

来自分类Dev

我可以使用 pactjs 来测试通过事件流和消息队列进行通信的微服务吗?

来自分类Dev

页面上的许多UI-Bootstrap-Datepickers加载速度非常慢-我可以使用单个实例并移动元素吗?

来自分类Dev

如果记录顺序无关紧要,我可以使用单个Kinesis分片并行调用Lambda函数吗?

来自分类Dev

我可以使用单个AWS ELB托管2个不同域的2个SSL证书吗?

来自分类Dev

我可以使用git-svn从Subversion存储库中的单个目录创建Git存储库吗?

来自分类Dev

我们可以使用mysql中的字符串函数从单个查询中提取多个数据吗?

来自分类Dev

使用apigee,我们可以使多个API相互交谈,然后将其作为单个API进行代理吗?

来自分类Dev

我可以使用菜单或按钮在单个页面应用程序上切换反应组件吗?

来自分类Dev

我可以使用单个 Zephyr 测试用例来维护多个设备上的测试执行记录吗?

来自分类Dev

我可以使用python CSP吗?

Related 相关文章

  1. 1

    我可以使用 nginx 在单个端口中同时使用 http auth 和 sso 登录吗

  2. 2

    我可以使用FileSystemObject使用其索引从文件夹中获取单个文件吗?

  3. 3

    我可以使用CSS为表格列着色而不给单个单元格着色吗?

  4. 4

    我可以使用debdelta安装/更新单个软件包吗?

  5. 5

    我可以使用Always Emplace替换单个元素插入的插入吗?

  6. 6

    我可以使用单个Jsch Object打开多个通道吗?

  7. 7

    我们可以使用单个指针实现双向链接列表吗?

  8. 8

    我可以使用debdelta安装/更新单个软件包吗?

  9. 9

    我可以使用单个Unix命令创建,设置权限并写入文件吗?

  10. 10

    我可以使用批处理脚本取消隐藏单个文件夹或文件吗?

  11. 11

    我可以使用LINQ查询两个列表以填充单个列表吗

  12. 12

    我可以使用“包含”优化单个 linq 查询以预先加载查询元素吗

  13. 13

    我可以使用单个触发器影响多个控件的属性吗?

  14. 14

    我可以使用数组优化此代码以使其在单个循环中处理100页吗?

  15. 15

    使用APNS广播单个消息

  16. 16

    我可以使Intellij编译单个软件包吗?

  17. 17

    我可以使用multer和单个html格式将许多文件上传到不同的文件夹中吗?

  18. 18

    我的通知无法播放广播接收器

  19. 19

    如何使用C#广播来自Websocket的消息

  20. 20

    我可以使用 pactjs 来测试通过事件流和消息队列进行通信的微服务吗?

  21. 21

    页面上的许多UI-Bootstrap-Datepickers加载速度非常慢-我可以使用单个实例并移动元素吗?

  22. 22

    如果记录顺序无关紧要,我可以使用单个Kinesis分片并行调用Lambda函数吗?

  23. 23

    我可以使用单个AWS ELB托管2个不同域的2个SSL证书吗?

  24. 24

    我可以使用git-svn从Subversion存储库中的单个目录创建Git存储库吗?

  25. 25

    我们可以使用mysql中的字符串函数从单个查询中提取多个数据吗?

  26. 26

    使用apigee,我们可以使多个API相互交谈,然后将其作为单个API进行代理吗?

  27. 27

    我可以使用菜单或按钮在单个页面应用程序上切换反应组件吗?

  28. 28

    我可以使用单个 Zephyr 测试用例来维护多个设备上的测试执行记录吗?

  29. 29

    我可以使用python CSP吗?

热门标签

归档