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)
(一度だけ、あなたのコードで)falseを返すまで、Haskellは私はあなたのコードの断片はあなたを助けるために、誰のための十分なされているループを考えていないだろう。 'read_TXT'はどのように実装されていますか? 'hGetContents'のようなものを使うと、それはあなたの問題です。印刷物は、すべての内容がいつ受信されたかを知らず、EOFまでブロックされます。それはおそらく、接続を閉じて新しいものを開くのが役立つでしょう。 –
@ ThomasM.DuBuissonスリルフリー読み取り機能です。この場合、1つの構造体を読み込みます。 –