scalaz stream如何实现`询问然后等待答复` tcp客户端
我想实现一个客户端应用程序,它首先向服务器发送请求,然后等待服务器的回复(类似于http) 我的客户流程可能是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
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添加常见模式的示例将有助于我们了解该库:)