如何将Play Framework 2.8 WebSocket与接收器和源一起使用?

问题描述 投票:0回答:1

[我想我想将Play和Akka的in: Sinkout: Source用于WebSocket(而不是创建一个actor)。到目前为止,我仍然无法弄清楚该怎么做。

如何将消息发送到“外发”源?如何关闭“进”和“出”?我如何知道客户端是否关闭了连接?

我看了Nodejs WebSocket文档:https://github.com/websockets/ws#echowebsocketorg-demo

  • 有:ws.send('hello client');-我可以以某种方式使用Play的out吗?
  • 有:ws.on('message' ...-为此,我可以使用Sink.foreach(),对吧
  • ws.on('close' ... —任何接收器/源'关闭'事件以某种方式发生?
  • ws.close();-如何使用进出水槽源来做到这一点?

还是我应该使用in: Sinkout: Source以外的其他东西?我不想创建一个演员(或者,我对此也有疑问-那将是一个不同的话题)。

***

这里是Play's documentation中的示例:

// Log events to the console
val in = akka.stream.scaladsl.Sink.foreach[String](println)

// Send a single 'Hello!' message and then leave the socket open
val out = akka.stream.scaladsl.Source.single("Hello!")
  .concat(akka.stream.scaladsl.Source.maybe)

但是这让我想知道如何关闭“进”和“出”源(一段时间后,不是立即)以及我如何知道客户何时关闭它们。以及如何将有用的消息发送到“输出”:看着the Source docs,我找不到可用于将以后的不同消息发送到“输出”的任何东西。也许是ask方法? “使用询问模式将请求-回复消息发送给目标引用参与者”-我不清楚这意味着什么。

websocket playframework playframework-2.0
1个回答
0
投票

在这种情况下,想法是使用Flow“ fromSinkAndSource”(https://doc.akka.io/docs/akka/current/stream/operators/Flow/fromSinkAndSource.html),这将要求您提供Sink(它将消耗来自客户端的消息(类型In))和[ C0](将用于向客户端发送消息(类型Source))。

正如您所说,接收器可以使用您所说的Out运算符(也许有更好的选择,但我想现在还可以)。>>

对于源,我建议您使用foreachSource.queue)。一旦有了队列,就可以通过调用其https://doc.akka.io/docs/akka/current/stream/operators/Source/queue.html方法来终止它。请注意,但是,您将需要在某处跟踪对源的引用,并对其所涉及的客户端进行引用。

我希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.