27 votes

Ping Pong avec Haskell et Thrift est coincé

J'essaie de faire un simple Ping Pong en utilisant Haskell et Thrift. Cependant, il ne fait qu'une seule répétition, puis il reste bloqué. Je suppose que le problème réside dans l'utilisation (in) correcte de Thrift plutôt que dans Haskell. Quelque chose n'est probablement pas rincé correctement. Y a-t-il quelqu'un ayant de l'expérience avec Thrift qui pourrait m'aider à faire une supposition éclairée sur la façon de résoudre ce problème?

Serveur:

 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"
 

Client:

 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)
 

1voto

Andras Gyomrey Points 567

Votre problème est que vous renvoyez False de serverFunc. Haskell bouclera jusqu'à ce que vous retourniez false (par votre code, une seule fois)

http://hackage.haskell.org/packages/archive/thrift/0.6.0/doc/html/src/Thrift-Server.html#line-65

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X