echoサーバ/クライアント

一応動いてるように見えるけどネットワークプログラミングの理解が中途半端なので全うに動いているわけではないかもしれない。あとHaskellぽいインデントとかのコーディング規約みたいなものがよくわかっていない。あとで誰かに読んでもらって感想を聞こう。

#!runghc -v1

import Control.Concurrent
import Data.Char (toUpper, toLower)
import Network
import System.Exit
import System.IO

main :: IO ()
main = withSocketsDo $ do
    socket <- listenOn (PortNumber 10002)
    waitAccept socket
    sClose socket

waitAccept :: Socket -> IO ()
waitAccept socket = do
    (h, hostName, _) <- accept socket
    hSetBuffering h NoBuffering
    putStrLn $ "from: " ++ hostName
    forkIO $ echoLoop h uc
    waitAccept socket

echoLoop :: Handle -> (String -> String) -> IO ()
echoLoop h f = do
    hEOF <- hIsEOF h
    if hEOF then exitWith ExitSuccess
            else do
                hPutStrLn h . f =<< hGetLine h
                echoLoop h f

uc :: String -> String
uc [] = []
uc (x:xs) = toUpper x : uc xs

camel :: String -> String
camel [] = []
camel (x:xs) = toUpper x : map toLower xs
#!runghc -v1

import Network
import System.Exit
import System.IO

main :: IO ()
main = withSocketsDo $ do
    h <- connectTo "localhost" (PortNumber 10002)
    hSetBuffering h NoBuffering
    loop h
    hClose h

loop :: Handle -> IO ()
loop h = do
    eof <- isEOF
    if eof then exitWith ExitSuccess
           else do
               getLine >>= hPutStrLn h
               hGetLine h >>= putStrLn
               loop h