我正在尝试使用 Haskell 和 Thrift 做一个简单的 Ping Pong。但是,它只重复一次,然后就卡住了。我认为问题在于 Thrift 的(不)正确使用,而不是 Haskell。可能有些东西没有正确冲洗。有没有人在 Thrift 方面有经验,可以帮助我对如何解决这个问题做出有根据的猜测?
服务器:
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)
请您参考如下方法:
您的问题是您从 serverFunc 返回 False。 Haskell 将循环直到您返回 false (通过您的代码,只有一次)
http://hackage.haskell.org/packages/archive/thrift/0.6.0/doc/html/src/Thrift-Server.html#line-65