作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是一些使用 conduit
实现小型接收服务器的代码。 , network-conduit
, 和 stm-conduit
.它在套接字上接收数据,然后通过 STM channel 将其流式传输到主线程。
import Control.Concurrent (forkIO)
import Control.Concurrent.STM (atomically)
import Control.Concurrent.STM.TBMChan (newTBMChan, TBMChan())
import Control.Monad (void)
import Control.Monad.IO.Class (MonadIO (liftIO))
import Control.Monad.Trans.Class
import Data.ByteString (ByteString)
import qualified Data.ByteString as B
import Data.Conduit
import qualified Data.Conduit.Binary as DCB
import Data.Conduit.Extra.Resumable
import Data.Conduit.Network (sourceSocket)
import Data.Conduit.TMChan (sinkTBMChan, sourceTBMChan, mergeSources)
import System.Directory (removeFile)
import System.IO
type BSChan = TBMChan ByteString
listenSocket :: Socket -> Int -> IO BSChan
listenSocket soc bufSize = do
chan <- atomically $ newTBMChan bufSize
forkListener chan
return chan
where
forkListener chan = void . forkIO $ listen soc 2 >> loop where
loop = do
(conn, _) <- accept soc
sourceSocket conn $$ sinkTBMChan chan
close conn
loop
main :: IO ()
main = do
soc <- socket AF_UNIX Stream 0
bind soc (SockAddrUnix "mysock")
socChan <- listenSocket soc 8
sourceTBMChan socChan $$ DCB.sinkHandle stdout
removeFile "mysock"
Conduit
中有一些东西关于使源可恢复,但不是接收器。
最佳答案
来自 sinkTBMChan
的文档:
When the sink is closed, the channel will close too.
Source
来自
sourceSocket
关闭,关闭连接的接收器,进而关闭
TBMChan
传播到
sinkHandle
停止水槽。
loop
到连接之间不关闭的自定义源,并将该源连接到
TBMChan
.
listenSocket :: Socket -> Int -> IO BSChan
listenSocket soc bufSize = do
chan <- atomically $ newTBMChan bufSize
forkListener chan
return chan
where
forkListener chan = void . forkIO $ do
listen soc 2
loop $$ sinkTBMChan chan
loop = do
(conn, _) <- liftIO $ accept soc
sourceSocket conn
liftIO $ close conn
loop
关于sockets - 导管和 socket : allow multiple connections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20953852/
我希望将相同的数据分成两个“分支”分别处理,然后“加入”...... +----------+ +---
我有从 Data.Conduit 构建的以下类型: type Footers = [(ByteString, ByteString)] type DataAndConclusion = Conduit
我用 Haskell 编写了一个应用程序,它执行以下操作: 递归列出一个目录, 解析目录列表中的 JSON 文件, 寻找匹配的键值对,并且 返回找到匹配项的文件名。 我的这个应用程序的第一个版本是我能
我是一名优秀的程序员,十分优秀!