假设在我的程序中我需要连接到服务器(仅使用Network
,而不是Network.Socket
!)和post
,get
一些数据(将其视为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 ()
答案 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 ()