问题标签 [network-conduit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
503 浏览

sockets - 导管和插座:允许多个连接

conduit下面是一些使用、network-conduit和实现小型接收服务器的代码stm-conduit。它在套接字上接收数据,然后通过 STM 通道将其流式传输到主线程。

(在实际应用程序中,来自套接字的数据流与其他一些数据流合并,这就是为什么我不在侦听器中直接处理它的原因)。

问题是,我曾期望它在主线程被杀死之前保持打开状态,而是在套接字上收到第一条消息后退出。我无法弄清楚它为什么这样做,除非它是接收器(在第 2 到最后一行)在看到第一个数据流的结尾时退出。我可以说服它不要这样做吗?有一些Conduit关于使源可恢复的东西,但不是接收器。

0 投票
1 回答
123 浏览

haskell - Haskell中缺少数据构造函数HostAny

我正在尝试使用 Conduit Network,但无法编译此代码,因为它找不到数据构造函数:HostAny

安装了conduit-extra,所以我很困惑为什么找不到它?

这是 GHC 错误:

pez@devbox:~/dev$ runhaskell server.hs

0 投票
1 回答
129 浏览

haskell - 运行管道后如何获取值?

在启动更多管道之前,我需要在与客户端之间来回做一些事情并获取客户端对象或其名称字符串。

但我似乎无法让 appSink 让我有一个返回值。

我该怎么做?

更新

这是我最终得到的解决方案:

0 投票
1 回答
173 浏览

haskell - 使用管道从流式网络协议中获取结果

我正在使用管道实现一个简单的网络协议;该协议是一个消息流,每条消息都以 uint32 为前缀,描述消息的长度。(然后消息数据具有进一步的内部结构,但这在这里并不重要,因为我可以在解析之前将整个消息读入内存,因为预期的消息大小很小)。该协议在两个方向上都是相同的,客户端向服务器发送包含请求的消息,而服务器返回包含响应的消息(没有操作并发)。

我的想法是在两个简单的管道之上构建代码Message(我自己的类型描述各种可能的消息),ByteString反之亦然:

到目前为止,一切都很好; 或者至少,代码类型检查,尽管我确信有一种更优雅的方式来编写它(尤其是 中的循环messageReceiver)。现在我想写一些东西来连接服务器,发送请求,得到响应,然后断开连接。我写了这个:

但是,我不确定如何实际将其连接到网络客户端源和接收器,以使我得到“响应”值。我试过这个:

无法编译:

假设我在这里正确地遵循了类型,这将失败,因为网络客户端的接收器期望返回类型为(), not Message,所以我想我在这里需要一些其他形式的管道组合,但我不知道是什么。

0 投票
2 回答
723 浏览

http - Network.HTTP.Conduit 的 Haskell simpleHTTP 对获取请求执行缓慢

在我的 haskell 代码中,我已导入Network.HTTP.Conduit

在我的主要功能中,我GET使用simpleHTTP

完成 100 个 api 请求耗时 6 分 42 秒

ruby另一种方法只需要 153 秒即可使用 100 次 api 调用Net::HTTP.get(URI.parse("https://github.com/trending?l=ruby"))

我在我的 haskell 代码中做错了吗?什么是高性能和高效的替代方案simpleHTTP

0 投票
1 回答
97 浏览

haskell - 为什么使用网络管道时等待总是返回Nothing?

我正在尝试学习如何使用管道。我有一个管道,它接收字节串并将它们分组为代表发送到服务器的操作的数据包。然后我有一个管道接收这些数据包,对它们采取行动并产生一个响应数据包。最后,我有一个管道接收响应数据包并将它们转换为字节串流。问题是包处理管道中的 yield 总是返回 Nothing。我的代码看起来像这样

我使用 runTCPServer 运行管道,它能够接受连接,并且 getPacketConduit 能够将字节串转换为有效的数据包,但 awaitForever 从不调用它的函数。如果我修改 processPacketConduit 以改用 await,我可以看到它总是返回 Nothing。

0 投票
1 回答
327 浏览

multithreading - 有没有办法让管道从多个来源获取数据而不阻塞其中任何一个?

我正在编写一个服务器,其中一个要求是它需要能够将数据推送到客户端,而无需客户端直接请求数据。我正在使用导管,但感觉这超出了导管的能力。我遇到的问题是似乎没有办法判断套接字是否有可用的数据,并且 await 将阻止执行,直到有可用的数据。假设我有以下功能

然后我将管道与来自 Conduit.Network 库的源和接收器连接在一起

现在,我从管道外部引入一个数据源,并且我想将该数据合并到管道中。例如,如果这是一个聊天服务器,则外部数据将是其他客户端发送的消息。问题是,无论我尝试在哪里引入这些外部数据,它都会被调用 await 阻塞。本质上,我最终会得到如下所示的代码。

处理更多外部数据的唯一方法是上游组件产生某些东西,但上游只有在从客户端获取数据时才会产生,这正是我试图避免的。我已经尝试使用多个线程和 TChan 来解决这个问题,但似乎 appSource 和 appSink 必须在同一个线程中使用,否则我会从 recv 获得无效的文件描述符异常(这是有道理的)。

但是,如果套接字源和接收器在同一个线程中运行,我会再次遇到等待阻塞的问题,并且我无法检查套接字是否有可用的数据。在这一点上,我似乎已经用导管撞到了墙上。

但我真的很喜欢使用导管,并且更愿意继续使用它们。所以我的问题是:有没有办法做我想要通过管道实现的目标?

0 投票
1 回答
129 浏览

haskell - 如何关闭“runTCPServer”?

我正在编写一个带有runTCPServer来自conduit-extra(以前称为network-conduit)的套接字服务器。我的目标是使用此服务器与我的编辑器交互 --- 从编辑器激活服务器(很可能只是通过调用外部命令),使用它,并在工作完成后终止服务器。

为简单起见,我从一个简单的回显服务器开始,假设我想在连接关闭时关闭整个过程。

所以我尝试了:

但这不起作用——程序继续接受新的连接。如果我没记错的话,这是因为监听我们正在处理的连接的线程退出了exitSuccess,但整个过程没有。所以这是完全可以理解的,但是我一直没能找到退出整个过程的方法。

如何终止由运行的服务器runTCPServer?是runTCPServer应该永远服务的东西吗?

0 投票
1 回答
129 浏览

haskell - 使用 Haskell 管道的非平凡协议

我试图弄清楚如何使用 Haskell 管道实现一个重要的协议(通过 TCP)。我认为不平凡的例子:

  • 读取一些头字节,如果它们符合预期,忽略它们并继续;否则,向客户端返回错误。
  • 读取指示字段长度的 N 个字节,然后将该字节数读入一个字节串。
  • 在客户端和服务器之间执行来回握手,例如能力协商。协商后,根据协商的内容调用不同的服务器端代码。(例如协商服务器和客户端同意的协议版本)
  • 如果客户端未能足够快地协商协议,则连接超时,并向客户端发送错误

到目前为止,我正在努力...任何帮助或指向一些示例代码的指针将不胜感激!

0 投票
2 回答
159 浏览

haskell - 使用 Conduit 分块数据

这是一个conduit组合器的示例,当从上游接收到完整的消息时,它应该在yield下游:

服务器代码本身如下所示:

telnet 127.0.0.1 5000发送任何消息后由于某种原因断开连接:

请指教,我在这里做错了什么?

更新

更重要的是,我在这里尝试做的是等待完成信号|,然后yield是下游的完整消息。下面是message组合器的演变:

我的想法是,如果上游组合器没有任何内容,则必须等到有东西出现,这样它才能向下游发送完整的消息。但是在上述组合器中的调用中,它conduit开始在 CPU 上旋转很多。leftovermessage