雑記帳

ちょっとした文章とかメモ書きとか。

HaskellでTCPソケットクライアント

HaskellでTCPソケットクライアントを書いてみました。

mikutterにTCPソケットサーバーを立てて、
それにTCPソケットクライアントとして接続しに行きます。
mikutterはUTF8を扱うのでhSetEncoding h utf8でUTF8としています。

import Network
import System.IO
import System.IO.Error
import Prelude hiding (catch)

sendMessage :: String -> IO ()
sendMessage msg = withSocketsDo $ do 
        hSetBuffering stdout NoBuffering 
        h <- connectTo "127.0.0.1" (PortNumber 3939)
        hSetEncoding h utf8
        hSetBuffering h LineBuffering
        hPutStrLn h msg
        catch (hGetLine h)
              (\e -> checkEOFOrError e)
              >>= putStrLn
        hClose h

-- isEOFErrorは見なかったことにして終了
checkEOFOrError :: IOError -> IO [Char]
checkEOFOrError ex = if isEOFError ex then 
                         return () >> return "send done."
                     else ioError ex >> return "IOerror."

-- 文字数のチェック -- TODO:URLの文字数カウント
checkLengthAndTwit :: [Char] -> IO ()
checkLengthAndTwit msg
 | 0 == length msg = putStrLn "at least 1 character!" 
 | 140 < length msg = putStrLn "over 140 characters!!"
 | otherwise = sendMessage msg

main = do putStrLn "Input Tweet:"
          msg <- getLine
          checkLengthAndTwit msg

EOFの時のエラーを

-- isEOFErrorは見なかったことにして終了
checkEOFOrError :: IOError -> IO [Char]
checkEOFOrError ex = if isEOFError ex then 
                         return () >> return "send done."
                     else ioError ex >> return "IOerror."

として見なかったことにしているのだけれどいいのかこれ…
作っている最中にできない理由をつぶやいていたらすぐにリプライが飛んでくるTwitterこわいです

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。