2011-11-23 7 views
27

私はHaskellとThriftを使って簡単なPing Pongをやろうとしています。しかし、それは1回の反復だけを行い、つづいています。私は問題がHaskellではなくThriftの正しい使い方にあると仮定します。おそらく、何かが正しく洗い流されないでしょう。この問題を解決する方法を知ってもらうために私を助けることができたThriftの経験がある人はいますか?HaskellとThriftのPing Pongがついてしまう

サーバー:

echorequest :: TXT 
echorequest = TXT { 
    f_TXT_anytxt = Just "Ping" 
    } 

echoreply :: TXT 
echoreply = TXT { 
    f_TXT_anytxt = Just "Pong" 
    } 

serverFunc :: a -> (BinaryProtocol Handle, BinaryProtocol Handle) 
       -> IO Bool 
serverFunc a (h1,h2) = do 
    let t1 = getTransport h1 
    dat <- read_TXT h1 
-- the following two lines are only for debugging 
    putStrLn "Recieved data:" 
    print dat 
    write_TXT h1 echoreply 
    tFlush t1 
-- the following line is for debugging 
    putStrLn "Data written" 

    return False 


main :: IO() 
main = do 
    runBasicServer() serverFunc 4390 
    putStrLn "Server stopped" 

クライアント:

main :: IO() 
main = do 
    h <- connectTo "127.0.0.1" $ PortNumber 4390 
    let proto = BinaryProtocol h 
    putStrLn "Client started" 
    let tryOnePing c i = do 
     write_TXT proto echorequest 
     putStrLn "ping sent" 
     tFlush h 
     w <- read_TXT proto 
     putStrLn "pong received" 
     return $ if w == echoreply then c+1 else c 
    c <- foldM tryOnePing 0 [0 .. 1000] 
    tClose h 
    print (c, 10000 - c) 
+3

(一度だけ、あなたのコードで)falseを返すまで、Haskellは私はあなたのコードの断片はあなたを助けるために、誰のための十分なされているループを考えていないだろう。 'read_TXT'はどのように実装されていますか? 'hGetContents'のようなものを使うと、それはあなたの問題です。印刷物は、すべての内容がいつ受信されたかを知らず、EOFまでブロックされます。それはおそらく、接続を閉じて新しいものを開くのが役立つでしょう。 –

+0

@ ThomasM.DuBuissonスリルフリー読み取り機能です。この場合、1つの構造体を読み込みます。 –

答えて

関連する問題