[Haskell-beginners] Haskell network sample

Sylvain Henry hsyl20 at gmail.com
Wed May 21 08:07:27 UTC 2014


hGetContents puts the handle in semi-closed state and reads until there is
nothing left to read. Hence you have a deadlock. Use hGetLine in "cli".

Sylvain


2014-05-21 9:15 GMT+02:00 yang.zhao <hckjsnzf at gmail.com>:

> omg, i test it on Windows, it's ok now. GHC is 7.6.3.
> i really don't konw why this happen..
>
> but there is another question on Windows
>
>
> main = withSocketsDo $ do
>     s <- listenOn $ PortNumber $ fromIntegral port
>     putStrLn "Listening..."
>     (h, _, _) <- accept s
>     putStrLn "After accept"
>     sline <- hGetLine h
>     putStrLn $ "get line from handle"++sline
>     hPutStrLn h "xxxx...."
>     putStrLn "send first done"
>
>     --second recv
>     slinea <- hGetLine h
>     putStrLn $ "get line from handle"++slinea
>
>     hPutStrLn h "yyyy....."
>     putStrLn "send second done"
>
>     threadDelay 1000000
> --
> cli:
>
> main = withSocketsDo $ do
>     h <- connectTo "127.0.0.1" $ PortNumber $ fromIntegral port
>     putStrLn "After connect"
>     hPutStrLn h "xxx"
>     putStrLn "put first to handle done"
>
>     bs <- hGetContents h
>     putStrLn "read from handle done "
>     putStrLn bs
>
>     --second send
>     hPutStrLn h "yyy"
>     putStrLn "put second to handle done"
>     bfs <- hGetContents h
>
>     putStrLn "read from handle done "
>     putStrLn bs
>
>
> the second send and recv is blocking...
> server's output:
> Listening...
> After accept
> get line from handlexxx
> send first done
>
> client's output:
> After connect
> put first to handle done
> read from handle done
> xxx....
>
>
> ..... T_T
>
>
>
>
> 2014-05-21 14:10 GMT+08:00 yang.zhao <hckjsnzf at gmail.com>:
>
> Here's my new code:
>>
>> $ cat serv.hs
>>
>> import Control.Concurrent
>> import System.IO
>> import Network
>>
>> port :: Int
>> port = 1234
>>
>> main :: IO ()
>> main = withSocketsDo $ do
>>     s <- listenOn $ PortNumber $ fromIntegral port
>>     putStrLn "Listening..."
>>
>>     (h, _, _) <- accept s
>>     putStrLn "After accept"
>>     sline <- hGetLine h
>>     putStrLn "get line from handle"
>>
>>     hPutStrLn h sline
>>     putStrLn $ "send "++sline
>>     threadDelay 1000000
>>
>>     hClose h
>>     sClose s
>>
>> --------
>> $ cat clie.hs
>>
>> import System.IO
>> import Network
>>
>> port :: Int
>> port = 1234
>>
>> main :: IO ()
>> main = withSocketsDo $ do
>>     h <- connectTo "127.0.0.1" $ PortNumber $ fromIntegral port
>>     putStrLn "After connect"
>>     hPutStrLn h "hello"
>>     putStrLn "put hello to handle done"
>>     bs <- hGetContents h
>>     putStrLn "read from handle done"
>>     putStrLn bs
>>     hClose h
>>
>>
>> ===
>> one terminal, run ./serv, then run ./clie in another terminal. Output is :
>>
>> $ ./serv
>> Listening...
>> After accept
>>
>> $ ./clie
>> After connect
>> put hello to handle done
>> read from handle done
>>
>>
>> it seems that client has read from then handle, but donesn't read
>> anything, then block.
>> and server donesn't receive anything, still wait for something...
>>
>> ghc version is 7.4.1, because of this?..
>>
>>
>> 2014-05-21 13:57 GMT+08:00 Bob Ippolito <bob at redivi.com>:
>>
>> Not sure why you're having issues, I just tried it on GHC 7.6.3 on Fedora
>>> 20 and it worked fine there as well (both with runhaskell or compiled with
>>> -O).
>>>
>>> I might start adding putStrLn statements to the code to see where it's
>>> unexpectedly blocking, or perhaps use 127.0.0.1 instead of "localhost" in
>>> case the issue is a DNS misconfiguration.
>>>
>>>
>>>
>>> On Tue, May 20, 2014 at 10:51 PM, yang.zhao <hckjsnzf at gmail.com> wrote:
>>>
>>>> thanks for your replay.
>>>> i run the two program in two different teriminal for sure.
>>>>
>>>> it works for you?
>>>> but why can't run well on my computer.
>>>>
>>>> make me creazy....
>>>>
>>>>
>>>> 2014-05-21 13:47 GMT+08:00 Bob Ippolito <bob at redivi.com>:
>>>>
>>>> How precisely are you trying to run the client? Are you typing it in to
>>>>> the same terminal? If so, then the client is never actually started,
>>>>> because when you type ./cli the input is going to ./serv and not the shell.
>>>>> Try running the client in a separate terminal.
>>>>>
>>>>> It works for me here on Mac OS X 10.9.2 with GHC 7.8.2.
>>>>>
>>>>>
>>>>> On Tue, May 20, 2014 at 10:42 PM, yang.zhao <hckjsnzf at gmail.com>wrote:
>>>>>
>>>>>> hi guys,
>>>>>> I'm newbie, just begin to learn Haskell.
>>>>>> now i write a very simple server and client .
>>>>>>
>>>>>> Server:
>>>>>> import Control.Concurrent
>>>>>> import System.IO
>>>>>> import Network
>>>>>>
>>>>>> port :: Int
>>>>>> port = 1234
>>>>>>
>>>>>> main :: IO ()
>>>>>> main = withSocketsDo $ do
>>>>>>     s <- listenOn $ PortNumber $ fromIntegral port
>>>>>>     (h, _, _) <- accept s
>>>>>>
>>>>>>     sline <- hGetLine h
>>>>>>     hPutStrLn h sline
>>>>>>     putStrLn $ "send "++sline
>>>>>>     threadDelay 1000000
>>>>>>
>>>>>>     hClose h
>>>>>>     sClose s
>>>>>>
>>>>>> Client :
>>>>>> import System.IO
>>>>>> import Network
>>>>>>
>>>>>> port :: Int
>>>>>> port = 1234
>>>>>>
>>>>>> main :: IO ()
>>>>>> main = withSocketsDo $ do
>>>>>>     h <- connectTo "localhost" $ PortNumber $ fromIntegral port
>>>>>>     hPutStrLn h "hello"
>>>>>>     bs <- hGetContents h
>>>>>>     putStrLn bs
>>>>>>     hClose h
>>>>>>
>>>>>>
>>>>>> And, it doesn't work now . I run ./serv , then run ./cli , they will
>>>>>> block all the time.
>>>>>> but,  when i run ./serv, and telnet localhost 1234 in another
>>>>>> terminal, it works fine.
>>>>>> so i don't know what's the wrong with my code.
>>>>>> anybody can tell me about my problem?
>>>>>>
>>>>>> os is Debian 7,  haskell-platform  2012.2.0.0
>>>>>>
>>>>>> thanks a lot!!!
>>>>>> --
>>>>>> K.I.S.S.
>>>>>>
>>>>>> _______________________________________________
>>>>>> Beginners mailing list
>>>>>> Beginners at haskell.org
>>>>>> http://www.haskell.org/mailman/listinfo/beginners
>>>>>>
>>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Beginners mailing list
>>>>> Beginners at haskell.org
>>>>> http://www.haskell.org/mailman/listinfo/beginners
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> K.I.S.S.
>>>>
>>>> _______________________________________________
>>>> Beginners mailing list
>>>> Beginners at haskell.org
>>>> http://www.haskell.org/mailman/listinfo/beginners
>>>>
>>>>
>>>
>>> _______________________________________________
>>> Beginners mailing list
>>> Beginners at haskell.org
>>> http://www.haskell.org/mailman/listinfo/beginners
>>>
>>>
>>
>>
>> --
>> K.I.S.S.
>>
>
>
>
> --
> K.I.S.S.
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20140521/fe56f2c9/attachment-0001.html>


More information about the Beginners mailing list