Play框架中的套接字和流媒体

时间:2018-02-14 16:00:48

标签: scala playframework akka-stream akka-http playframework-2.6

我正在阅读Play-Socket.io documentation和Play WebSocket documentation,了解如何通过Akka Streams使用它们。

我无法理解为什么有必要使用Flow.fromSinkAndSource

Play WebSockets的文档说:

  

请注意,虽然从概念上讲,流程通常被视为某种东西   接收消息,对它们进行一些处理,然后生成消息   已处理的消息 - 没有理由这样做,   流的输入可以完全与输出断开   流动。 Akka流提供了一个构造函数,   Flow.fromSinkAndSource,正是为了这个目的,而且往往是在什么时候   处理WebSockets时,输入和输出将不会连接在   所有

我根本没有得到这个,为什么他们应该断开呢?为什么一个简单的Flow在这里没有意义?

1 个答案:

答案 0 :(得分:3)

  

我无法理解为什么有必要使用Flow.fromSinkAndSource ....我完全没有这个,为什么他们应该断开连接?为什么简单的Flow在这里没有意义?

在Play中,WebSocket消息处理程序是Flow[In, Out, _](通过Flow[Message, Message, Any]转换为MessageFlowTransformer /从Play documentation转换。如果您以请求 - 响应的方式使用WebSockets,那么您可以使用Flow[In].map或具有类似语义的东西来实现此处理程序(以下示例来自{{3}}):

def socket =  WebSocket.accept[String, String] { request =>

  // log the message to stdout and send response back to client
  Flow[String].map { msg =>
    println(msg)
    "I received your message: " + msg
  } // Flow[String, String, _]
}

在上面的示例中,输入和输出是连接的:输入被转换,并且该转换的结果被用作输出。

WebSockets也可能是真正的双向,这意味着输入和输出不一定必须连接。这是Flow.fromSinkAndSource发挥作用的时间:传递给此方法的SinkSource是独立的。一个简单的示例是一个忽略传入连接并简单地向套接字发送单个消息的处理程序:

def socket = WebSocket.accept[String, String] { request =>

  // Just ignore the input
  val in = Sink.ignore

  // Send a single 'Hello!' message and close
  val out = Source.single("Hello!")

  Flow.fromSinkAndSource(in, out) // Flow[String, String, _]
}

在上面的例子中,使用了Flow.fromSinkAndSource,因为输入和输出没有连接:输入与输出无关。

无论您是以请求 - 响应还是真正双向的方式使用WebSockets,这两种方法都被建模为Flow[In, Out, _]。如果您以真正的双向方式使用WebSockets,则可以使用Flow.fromSinkAndSource来实现Flow[In, Out, _]