sockets - hGetContents 与 hGetLine

标签 sockets haskell networking

我在 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

并使用 python 脚本对其进行了测试

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/

相关文章:

python - Squid 代理在 python 发出的 GET 请求上给出 501 但不 curl

haskell - 对于没有 `otherwise` 子句的 Haskell 函数,模式匹配是非详尽的

haskell - 合并无限数量的有序无限序列

c - Linux,了解用于网络扩展的 setsockopt() PACKET_FANOUT

windows-phone-7 - 如何在 Windows Phone 7 中获取 Wi-Fi 和移动网络参数?

python - Socket.sendall() 不发送给所有连接的客户端

java nio 选择器返回选定的键,但对它们没有可用的操作

python从 friend 那里接收数据

haskell 如何从此代码中删除列表用法?

networking - 用于对大数据传输进行 udp 和 tcp 性能基准测试的实用程序