タグ

ブックマーク / napthats.hatenadiary.org (3)

  • Haskellでゲーム用TCPサーバ - napthats’

    Haskellでゲーム作ろうと思ってTCPサーバを探したら、クライアント同士のやり取りとかがやりにくいのしか見つからなかったので書いた。 napthats / SimpleTCPServer 使い方はtest.hsとSimpleTCPServer.hs参照。だいたい以下のような感じ。 ・runTCPServerで起動してクライアントを自動で受け付けつづける。 ・クライアントからのメッセージはget〜系関数を使うと取れる。MaybeかListで取ってくるのでブロックはしない。 -getClientMessageで(どれかは分からない)あるクライアントの未取得のメッセージのうち最も古いものを(クライアントID, メッセージ)の形式で取ってくる。 -getEachClientMessagesで未取得のメッセージを持ってる全クライアントから(クライアントID, メッセージ)を一つずつ取ってくる。

    Haskellでゲーム用TCPサーバ - napthats’
  • Conduitを使ってみる - napthats’

    なんかIO扱ったりするのにConduitが熱いらしいので使ってみた。まだよく分かってないのでたぶん色々間違ってる。 ConduitではSourceから一つずつ流れてくるデータをConduitで流れ方を変えたり加工したりしてSinkに流す。SourceとSinkがファイルでConduitが無い場合(つまりファイルの中身を全部コピーするだけ)の例は以下の通り。 import Data.Conduit (($$)) import qualified Data.Conduit as C import qualified Data.Conduit.Binary as CB main :: IO () C.runResourceT $ CB.sourceFile "in.txt" $$ CB.sinkFile "out.txt" sourceFileでファイルの中身をまとめて流すSourceを作り、s

    Conduitを使ってみる - napthats’
  • Haskellで並行処理 - napthats’

    forkIOでスレッドを起動できる。forkIOは(IOモナドに包まれた)スレッドIDを返すので、取っておいて後でkillThreadするとThreadKilled例外を投げて終了できる。 import Control.Concurrent main :: IO () main = do id <- forkIO $ subThread 0 threadDelay 5000000 killThread id subThread :: Int -> IO () subThread num = do putStrLn $ "loop " ++ (show num) threadDelay 1000000 subThread $ num + 1 スレッド間でメッセージを送受信したい場合は、MVarを使う。MVarは容量1のメッセージボックスで、既にメッセージが入ってる時に更に書き込もうとするとブ

    Haskellで並行処理 - napthats’
  • 1