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

如何将Play Framework 2.8 WebSocket与接收器和源一起使用?,websocket,playframework,playframework-2.0,Websocket,Playframework,Playframework 2.0,我想我应该使用Play和Akka的in:Sink和out:Source来制作WebSocket(而不是创建一个演员)。不过,到目前为止,我还不知道该怎么做 如何向“输出”源发送消息?如何关闭“输入”和“输出”?如何知道客户端是否关闭了连接 我查看了nodejswebsocket文档: 有:ws.send('hello client')-我能以同样的方式使用Play的out吗 有:ws.on('message')…-我可以使用Sink.foreach()来实现这一点,对吗 和ws.on('clo

我想我应该使用Play和Akka的
in:Sink
out:Source
来制作WebSocket(而不是创建一个演员)。不过,到目前为止,我还不知道该怎么做

如何向“输出”源发送消息?如何关闭“输入”和“输出”?如何知道客户端是否关闭了连接

我查看了nodejswebsocket文档:

  • 有:
    ws.send('hello client')-我能以同样的方式使用Play的
    out
  • 有:
    ws.on('message')…
    -我可以使用
    Sink.foreach()
    来实现这一点,对吗
  • ws.on('close')…
    -是否有任何接收器/源“close”事件
  • ws.close();
    -如何使用in-out接收器源代码实现这一点
或者我应该使用其他东西而不是
in:Sink
out:Source
? 我宁愿不创造一个演员(或者,我也有关于这个的问题——这是一个不同的话题)

***

以下是中的示例:

但这让我想知道如何关闭“输入”接收器和“输出”源 (一段时间后,不是立即)

我如何知道客户端何时关闭它们。以及如何向“out”发送有用的消息:查看,我找不到任何东西可以用于稍后向“out”发送不同的消息。可能是
ask
方法?“使用ask模式向目标ref actor发送请求-回复消息”-我不清楚这意味着什么。

本例中的想法是使用流“fromSinkAndSource”(),这将要求您提供一个
接收器(它将使用来自客户端的消息(在
中键入
))和一个
源(将用于向客户端发送消息(在
中键入

正如您所说,接收器可以使用一些
foreach
操作符(可能有更好的选择,但现在我想还可以)

对于源代码,我建议您使用
source.queue
()。一旦您有了一个队列,您可以通过调用其
complete
方法来终止它。但是,请注意,您需要在某处跟踪对源代码的引用,以及它所涉及的客户端的引用


我希望这会有所帮助。

你好,Antoine,谢谢,这可能会起作用。查看
Source/queue.html
似乎可以在发送到WS客户端时得到
QueueOfferResult.QueueClosed
结果-这样我就可以知道WS连接是否关闭了?也就是在发送到客户端时……我还试图找到一种获得通知的方法d当接收器中的
关闭时(这样就不需要向
源.queue
发送消息以确定连接是否仍在工作),我看到了这些
对象接收器
方法:
Sink.foreach[String](println)
Sink.onComplete(\u=>println(“WS-connection-gone”))
-但是,我不知道如何创建一个同时具有foreach和onComplete方法的接收器?(这样,当有传入消息时,以及当接收器中的WS
由于WS-connection关闭而关闭时,都可以得到通知)。有没有办法将foreach与onComplete结合起来?我会调用
queue.toMat(…).run()
?或将为我玩吗?似乎直到有人打电话给
.toMat(…).run()
,才有
.offer()
方法-一个人还没有获得
SourceQueueWithComplete
。发现像5-10个其他人一样有同样的问题,最终我偶然发现:
Flow.fromSinkAndSourceMat(inSink,outSource)((inSink,outboundMat)=>{outboundMat.offer(JsString(“kittens”))
在这个示例项目中:,我认为应该可以用。B.t.w.似乎有一个
流。fromskinkandSource(inSink,outSource)。watchTermination
方法来确定WS何时关闭。
// 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)