为什么在使用网络管道时 await 总是 return Nothing?
Why does await always return Nothing when using network conduits?
我正在努力学习如何使用导管。我有一个管道,它接收字节串并将它们分组为表示发送到服务器的操作的数据包。然后我有一个管道接收这些数据包,对它们进行操作并产生一个响应数据包。最后,我有一个管道接收响应数据包并将它们转换为字节串流。问题是数据包处理管道中的 yield 总是 returns 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)
I 运行 管道使用 运行TCPServer 并且它能够接受连接并且 getPacketConduit 能够将字节串转换为有效的数据包,但 awaitForever 从不调用它的函数。如果我将 processPacketConduit 修改为使用 await,我可以看到它总是 returns Nothing.
我弄清楚了我的错误,我忘记了谷物通过发送 length :: Int 后跟实际数据来序列化字节串。我只发送一个字节的长度。
我正在努力学习如何使用导管。我有一个管道,它接收字节串并将它们分组为表示发送到服务器的操作的数据包。然后我有一个管道接收这些数据包,对它们进行操作并产生一个响应数据包。最后,我有一个管道接收响应数据包并将它们转换为字节串流。问题是数据包处理管道中的 yield 总是 returns 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)
I 运行 管道使用 运行TCPServer 并且它能够接受连接并且 getPacketConduit 能够将字节串转换为有效的数据包,但 awaitForever 从不调用它的函数。如果我将 processPacketConduit 修改为使用 await,我可以看到它总是 returns Nothing.
我弄清楚了我的错误,我忘记了谷物通过发送 length :: Int 后跟实际数据来序列化字节串。我只发送一个字节的长度。