scalaz-stream如何实现`ask-then-wait-reply` tcp客户端

时间:2015-01-15 15:37:24

标签: scala scalaz scalaz-stream

我想实现一个首先向服务器发送请求然后等待其回复的客户端应用程序(类似于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的剩余部分?

1 个答案:

答案 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然后终止。