Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scalaz stream如何实现`询问然后等待答复` tcp客户端_Scala_Scalaz_Scalaz Stream - Fatal编程技术网

scalaz stream如何实现`询问然后等待答复` tcp客户端

scalaz stream如何实现`询问然后等待答复` tcp客户端,scala,scalaz,scalaz-stream,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

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

通常,实现是通过sink发布消息,然后等待某个源的某种回复,比如您的主题

实际上,我们的代码中有很多这样的习惯用法:

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
,然后终止

TSource[O2]
是否与
Process1[O,O2]
相同?实际上不是,它是我们的
Process[Task,O2]
代码库中的类型别名,很抱歉混淆。啊,谢谢@pavel:)如果能在野外看到更多这样的示例,那就太好了:)向scalaz stream wiki添加常见模式的示例将有助于我们了解该库:)