作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Haskell
中有一个程序从套接字获取所有输入并打印它。
main = withSocketsDo $ do
sock <- listenOn $ PortNumber 5002
netLoop sock
netLoop sock = do
(h,_,_) <- accept sock
hSetBuffering h NoBuffering
forkIO $ workLoop h
netLoop sock
workLoop :: Handle -> IO ()
workLoop h = do
str <- hGetContents h
putStr str
--do any work
hGetLine
相反
hGetContents
我遇到了一些奇怪的行为。我的程序在按 Ctrl-C 之前什么都不显示,然后我看到发送的网络数据的第一行。我建议这种行为与 lasy 执行有关,但是为什么 hGetContents 可以按预期工作而 hGetLine 不行?
最佳答案
您需要使用 LineBuffering
如果您想使用 hGetLine
逐行阅读.我得到它的工作
import Network
import System.IO
import Control.Concurrent
main :: IO ()
main = withSocketsDo $ do
sock <- listenOn $ PortNumber 5002
netLoop sock
netLoop :: Socket -> IO ()
netLoop sock = do
putStrLn "Accepting socket"
(h,_,_) <- accept sock
putStrLn "Accepted socket"
hSetBuffering h LineBuffering
putStrLn "Starting workLoop"
forkIO $ workLoop h
netLoop sock
workLoop :: Handle -> IO ()
workLoop h = do
putStrLn "workLoop started"
str <- hGetLine h
putStrLn $ "Read text: " ++ str
-- do any work
import socket
s = socket()
s.connect(('127.0.0.1', 5002))
s.send('testing\n')
s.close()
Accepting socket
Accepted socket
Starting workLoop
workLoop started
Accepting socket
Read text: testing
NoBuffering
,我会得到相同的行为和
hGetContents
关于sockets - hGetContents 与 hGetLine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25040884/
我有一个套接字服务器,它通过 hGetLine 等待来自连接的输入。这在发送带有尾随换行符的消息时非常有效。我想要的是在接收到换行符或空字符时从缓冲区中抓取——将句柄的缓冲区模式设置为 NoBuffe
我在 Haskell 中有一个程序从套接字获取所有输入并打印它。 main = withSocketsDo $ do sock IO () work
我将 FM-SBLEX Saldo 程序包装在 Java 库中。 Saldo 是用 Haskell 编写的,并在词典中查找标准输入中给出的行,例如 echo "ord"|./sblex/bin/sal
我尝试在 docker-compose 服务中为我的 haskell RPC 服务器代码设置自动重建和重新执行设置。该命令是带有 stack build --file-watch 的 bash 脚本(
我是一名优秀的程序员,十分优秀!