2015-07-22 61 views
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。

+1

你能提供一個完整的例子嗎?以最小的可能的例子來解決問題真的有助於縮小問題範圍。 – ErikR

回答

0

我想通了我的錯誤,我忘了穀物序列化字符串通過發送長度:: Int後跟實際數據。我只發送一個字節的長度。

相關問題