使用haskell连接到服务器(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 ()

Suppose in my program I need to connect to the server (using only Network, not Network.Socket!) and post, get some data (think about it as telnet analog). I need to receive messages from server in separate thread (because I can send something on server and get something seperatly). So the question is how to receive messages and and send it in two separate threads? I dont know how to use forkIO and how to use Handle

For now I wrote something like this:

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 ()

As I understood, this code works quite well. The main problem was with port I used. haskell.org's port 40 is not open (found out using nmap). So the connection just freezed. Only few changes I did in sender and receiver:

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

So the final code is

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 ()

更多推荐