Skip to main content
 首页 » 编程设计

haskell之使用 Haskell 和 Thrift 进行 Ping Pong 卡住

2024年10月25日19小虾米

我正在尝试使用 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