我想实现一个首先向服务器发送请求然后等待其回复的客户端应用程序(类似于http)
我的客户流程可能是
val topic = async.topic[ByteVector]
val client = topic.subscribe
这是api
trait Client {
val incoming = tcp.connect(...)(client)
val reqBus = topic.pubsh()
def ask(req: ByteVector): Task[Throwable \/ ByteVector] = {
(tcp.writes(req).flatMap(_ => tcp.reads(1024))).to(reqBus)
???
}
}
然后,如何实现ask
的剩余部分?
答案 0 :(得分:6)
通常,实现是通过接收器发布消息然后等待某些来源(如您的主题)的某种回复来完成的。
实际上我们的代码中有很多这样的习语:
def reqRply[I,O,O2](src:Process[Task,I],sink:Sink[Task,I],reply:Process[Task,O])(pf: PartialFunction[O,O2]):Process[Task,O2] = {
merge.mergeN(Process(reply, (src to sink).drain)).collectFirst(pf)
}
基本上这第一个钩子来回复流以等待任何结果O
确认我们发送的请求。然后,我们发布消息I
并咨询pf
,以便最终转换为O
的任何传入O2
然后终止。