Я пытаюсь научиться использовать кабелепроводы. У меня есть канал, который принимает байты и группирует их в пакеты, которые представляют собой действия, отправляемые на сервер. Затем у меня есть канал, который принимает эти пакеты, действует на них и дает ответный пакет. Наконец, у меня есть канал, который принимает пакеты ответов и превращает их в поток байтов. Проблема в том, что выход в канале обработки пакетов всегда возвращает 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 для использования ждут вместо этого, я вижу, что он всегда возвращает Nothing.
Можете ли вы привести полный пример? Приведение к минимуму возможного примера может действительно помочь в сужении проблемы. – ErikR