[Haskell-beginners] Haskell network sample

yang.zhao hckjsnzf at gmail.com
Wed May 21 07:15:04 UTC 2014


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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20140521/f86e1458/attachment-0001.html>


More information about the Beginners mailing list