[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