我不明白为什么有必要使用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
发挥作用的时候:传递给此方法的Sink
andSource
是独立的。一个简单的例子是一个处理程序,它忽略传入的连接并简单地向套接字发送一条消息:
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, _]
.