【发布时间】:2015-04-17 02:13:33
【问题描述】:
我是 stackoverflow 的新手,如果我做错了什么,请原谅我。我试图了解一个简单的服务器如何在 Haskell 中工作。我想我错过了一些关于 hGetContents 如何工作的非常简单或基本的东西。
import Network
import System.IO
main = withSocketsDo $ do
socket <- listenOn $ PortNumber 5002
(h, _, _) <- accept socket
c <- hGetContents h
-- putStrLn c -- doesn't work
-- putStrLn $ head $ lines c -- works!
-- putStrLn $ unlines $ take 2 $ lines c -- works!
-- putStrLn $ unlines $ take 3 $ lines c -- works!
-- putStrLn $ unlines $ take 6 $ lines c -- works!
putStrLn $ unlines $ take 10 $ lines c -- doesn't work
hPutStr h $ "HTTP/1.0 200 OK\r\nContent-Length: 5\r\n\r\nHello!\r\n"
hClose h
运行程序后,我通过网络浏览器导航到http://localhost:5002。问题似乎是,根据我解析句柄内容的程度,我最终无法发送响应。我希望能够在发送响应之前解析请求。我已经在代码中注释了可行的情况和不可行的情况。 Hoogle 说,对于 hGetContents (lazy),句柄在读取时是“半封闭的”。我是否误解了懒惰,或者我应该在开始解析其内容后考虑关闭句柄?
我得到的错误是“hPutChar:资源消失(断管)”。感谢您的帮助。
【问题讨论】:
标签: http haskell network-programming