[英]connecting to server with haskell
假設在我的程序中,我需要連接到服務器(僅使用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 ()
據我了解,該代碼運行良好。 主要問題是我使用的端口。 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 ()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.