Estoy tratando de hacer un simple Ping Pong usando Haskell y Thrift. Sin embargo, solo hace una repetición y luego se atasca. Supongo que el problema está en (en) el uso correcto de Thrift en lugar de en Haskell. Probablemente algo no se enjuaga correctamente. ¿Hay alguien con experiencia en Thrift que pueda ayudarme a adivinar cómo solucionar esto?Ping Pong con Haskell y Thrift se atasca
Servidor:
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"
Cliente:
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)
no creo que sus fragmentos de código son suficientes para cualquier persona que le ayude. ¿Cómo se implementa 'read_TXT'? Si utiliza algo como 'hGetContents', ese es su problema: la impresión no sabrá cuándo se han recibido todos los contenidos y se bloqueará hasta EOF. Esa es probablemente la razón por la cual cerrar la conexión y abrir una nueva ayuda. –
@ ThomasM.DuBuisson Es la función de lectura de ahorro. En este caso, para leer una estructura –