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