0
我正試圖學習如何使用管道。我有一個管道,它接收字節串並將它們分組成表示要發送到服務器的操作的數據包。然後我有一個管道,它接收這些數據包,對它們進行操作併產生響應數據包。最後,我有一個管道,它接收響應數據包並將它們變成一串字節串。問題是數據包處理管道中的產量總是返回Nothing。我的代碼看起來像這樣爲什麼在使用網絡管道時等待總是返回什麼?
processingConduit :: ServerState -> Conduit BS.ByteString IO BS.ByteString
processingConduit state = getPacketConduit
=$= processPacketConduit state
=$= putPacketConduit
processPacketConduit :: ServerState -> Conduit ClientPacket IO ServerPacket
processPacketConduit state = awaitForever $ \packet -> do
liftIO $ putStrLn "got something :)"
let function = case packet of
(LoginPacket _ _) -> login
_ -> ugh
result <- liftIO $ function state packet
yield result
getPacketConduit :: Conduit BS.ByteString IO ClientPacket
getPacketConduit = conduitGet (get :: Get ClientPacket)
putPacketConduit :: Conduit ServerPacket IO BS.ByteString
putPacketConduit = conduitPut (put :: ServerPacket -> Put)
我運行使用runTCPServer管道,它是能夠接受連接和getPacketConduit能夠將字節字符串轉換成有效的數據包,但awaitForever永遠不會調用其功能。如果我修改processPacketConduit來使用await,我可以看到它總是返回Nothing。
你能提供一個完整的例子嗎?以最小的可能的例子來解決問題真的有助於縮小問題範圍。 – ErikR