Я не могу понять, зачем нужно использовать Flow.fromSinkAndSource
....Я вообще не понимаю, почему их вообще надо отключать? Почему простое Flow
здесь не имеет смысла?
В Play обработчик сообщений WebSocket представляет собой Flow[In, Out, _]
(который преобразуется в/из Flow[Message, Message, Any]
через MessageFlowTransformer
). Если вы используете WebSockets в режиме запрос-ответ, вы можете использовать Flow[In].map
или что-то с похожей семантикой для реализации этого обработчика (следующие примеры взяты из Играть в документацию):
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
вступает в игру: Sink
и Source
, которые передаются в этот метод, независимы. Тривиальным примером этого является обработчик, который игнорирует входящее соединение и просто отправляет одно сообщение в сокет:
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, _]
.
person
Jeffrey Chung
schedule
14.02.2018