[我想我想将Play和Akka的in: Sink
和out: 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: Sink
和out: 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
方法? “使用询问模式将请求-回复消息发送给目标引用参与者”-我不清楚这意味着什么。
在这种情况下,想法是使用Flow“ fromSinkAndSource”(https://doc.akka.io/docs/akka/current/stream/operators/Flow/fromSinkAndSource.html),这将要求您提供Sink
(它将消耗来自客户端的消息(类型In
))和[ C0](将用于向客户端发送消息(类型Source
))。
正如您所说,接收器可以使用您所说的Out
运算符(也许有更好的选择,但我想现在还可以)。>>
对于源,我建议您使用foreach
(Source.queue
)。一旦有了队列,就可以通过调用其https://doc.akka.io/docs/akka/current/stream/operators/Source/queue.html方法来终止它。请注意,但是,您将需要在某处跟踪对源的引用,并对其所涉及的客户端进行引用。
我希望有帮助。