簡體   English   中英

使用haskell連接到服務器

[英]connecting to server with 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 ()

據我了解,該代碼運行良好。 主要問題是我使用的端口。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM