[Haskell-beginners] Haskell network sample
yang.zhao
hckjsnzf at gmail.com
Wed May 21 08:17:04 UTC 2014
Thank you very much, Bob and Sylvain.
i test hGetLine instead of hGetContents.
2014-05-21 16:07 GMT+08:00 Sylvain Henry <hsyl20 at gmail.com>:
> 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
>>
>>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>
--
K.I.S.S.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20140521/7fbdf46d/attachment.html>
More information about the Beginners
mailing list