Próbuję zrobić proste Ping Pong używając Haskell i Thrift. Jednak robi tylko jedno powtórzenie, a następnie utknie. Zakładam, że problem tkwi w (nie) poprawnym wykorzystaniu Thrift, a nie w Haskell. Prawdopodobnie coś nie jest prawidłowo spłukane. Czy jest ktoś z doświadczeniem w Thrift, który mógłby mi pomóc w odgadnięciu, jak to naprawić?Ping Pong z Haskellem i Thrift utknął
Serwer:
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"
Klient:
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)
Nie sądzę twoi fragmenty kodu są na tyle ktoś pomóc. W jaki sposób zaimplementowano 'read_TXT'? Jeśli używa czegoś w rodzaju 'hGetContents', to jest twój problem - drukowanie nie będzie wiedzieć, kiedy cała zawartość zostanie odebrana i będzie blokowana do EOF. Pewnie dlatego pomaga zamknięcie połączenia i otwarcie nowego. –
@ ThomasM.DuBuisson Jest to funkcja czytania Thrift. W tym przypadku, aby przeczytać jedną strukturę. –