使用haskell连接到服务器

时间:2015-11-16 08:24:21

标签: haskell

假设在我的程序中我需要连接到服务器(仅使用Network,而不是Network.Socket!)和postget一些数据(将其视为telnet模拟)。我需要在单独的线程中从服务器接收消息(因为我可以在服务器上发送一些东西并单独得到一些东西)。那么问题是如何接收消息并将其发送到两个单独的线程中?我不知道如何使用forkIO以及如何使用Handle

现在我写了这样的话:

sender :: Handle -> IO ()
sender h = do
    toSend <- getContents
    hPutStr h toSend
    sender h

receiver :: Handle -> IO ()
receiver h = do
    response <- hGetContents h
    putStrLn $ "the response is: " ++ response
    receiver h

main :: IO ()
main = do
    let host = "haskell.org"
    let port = 40
    h <- connectTo host (PortNumber $ fromIntegral i)
    forkIO $ receiver h
    sender h
    return ()

1 个答案:

答案 0 :(得分:0)

据我所知,这段代码效果很好。主要问题是我使用的端口。 haskell.org的端口40未打开(使用nmap找到)。所以连接只是冻结了。我在发送方和接收方中只做了很少的改动:

sender :: Handle -> IO ()
sender h = getContents >>= hPutStrLn h

receiver :: Handle -> IO ()
receiver h = hGetContents h >>= putStrLn

所以最终的代码是

import Network
import Control.Concurrent(forkIO)
import System.IO
import System.Environment
import Control.Monad

sender :: Handle -> IO ()
sender h = getContents >>= hPutStrLn h

receiver :: Handle -> IO ()
receiver h = forever $ hGetLine h >>= putStrLn 

main :: IO ()
main = do
    [host, port] <- getArgs
    h <- connectTo host (Service port)
    forkIO $ receiver h
    sender h
    return ()