2015-07-22 9 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 для использования ждут вместо этого, я вижу, что он всегда возвращает Nothing.

+1

Можете ли вы привести полный пример? Приведение к минимуму возможного примера может действительно помочь в сужении проблемы. – ErikR

ответ

0

Я понял свою ошибку, я забыл, что зерно сериализует bytestring, отправив длину :: Int, за которой следуют фактические данные. Я отправлял только один байт на длину.