0

我正在阅读有关如何通过 Akka Streams 使用它们的 Play-Socket.io文档和 Play WebSocket文档。

我不明白为什么有必要使用Flow.fromSinkAndSource.

Play WebSockets 的文档说:

请注意,虽然从概念上讲,流通常被视为接收消息,对它们进行一些处理,然后生成处理后的消息的东西 - 没有理由必须如此,流的输入可能完全断开连接从流的输出。Akka 流提供了一个构造函数 Flow.fromSinkAndSource 正是为此目的,并且通常在处理 WebSockets 时,输入和输出根本不会连接。

我根本不明白,为什么他们应该完全断开连接?为什么简单的Flow在这里没有意义?

4

1 回答 1

3

我不明白为什么有必要使用Flow.fromSinkAndSource....我根本不明白,为什么它们应该完全断开连接?为什么简单的Flow在这里没有意义?

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

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发挥作用的时候:传递给此方法的SinkandSource是独立的。一个简单的例子是一个处理程序,它忽略传入的连接并简单地向套接字发送一条消息:

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使用 是因为输入和输出没有连接:输入与输出无关。

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

于 2018-02-14T17:29:04.480 回答