gpt4 book ai didi

scala - 如何从 TCP 读取数据并写入 stdout?

转载 作者:行者123 更新时间:2023-12-02 20:52:14 26 4
gpt4 key购买 nike

我无法运行一个简单的 scalaz-stream 示例,无法从 TCP 读取数据并写入 std 输出。

val src = tcp.reads(1024)
val addr = new InetSocketAddress(12345)
val p = tcp.server(addr, concurrentRequests = 1) {
src ++ tcp.lift(io.stdOutLines)
}
p.run.run

它只是坐在那里,不打印任何东西。

我还尝试了使用 to 的各种安排,始终使用 tcp.lift 咒语来获取 Process[Connection, A] ,包括

tcp.server(addr, concurrentRequests = 1)(src) map (_ to tcp.lift(io.stdOutLines))

它甚至无法编译。

我需要将源流和打印流一起wye吗?我在original pull request上找到的一个例子对于 tcp 替换 nio 似乎表明了这一点,但 wye 似乎不再存在于 Process 上,因此出现了困惑不幸的是。

<小时/>

编辑事实证明,除了 Paul 解释的类型问题之外,您还需要“手动”运行内部进程,例如通过执行 p.map(_.运行.运行).运行.运行。我不认为这是惯用的方法,但它确实有效。

最佳答案

您需要通过接收器传递src才能实际写入任何内容。我认为这应该可以做到:

import scalaz.stream.{io,tcp,text}
import scalaz.stream.tcp.syntax._

val p = tcp.server(addr, concurrentRequests = 1) {
tcp.reads(1024).pipe(text.utf8Decode) through tcp.lift(io.stdOutLines)
}
p.run.run

表达式src++ tcp.lift(io.stdOutLines)确实应该是类型错误。 tcp.reads(1024) 的类型为 Process[Connection,ByteVector]tcp.lift(io.stdOutLines) 的类型是Process[Connection, String => Task[Unit]]。附加这两个进程没有意义,它进行类型检查的唯一原因是 Process[+F[_],+O] 的协方差。当您附加两个具有不相关输出类型的进程时,Scala 会“有效地”推断 Any

scalaz-stream 的 future 版本可能会对 ++ 和其他利用协方差的函数添加约束,以确保计算出的最小上限不会像 Any 那样无用。 可序列化。这对于防止此类错误大有帮助。同时,请确保您了解正在使用的所有函数的类型、它们的作用以及如何将它们组合在一起。

关于scala - 如何从 TCP 读取数据并写入 stdout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27491828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com