Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯克尔和节俭的乒乓球被卡住了_Haskell_Thrift - Fatal编程技术网

Haskell 哈斯克尔和节俭的乒乓球被卡住了

Haskell 哈斯克尔和节俭的乒乓球被卡住了,haskell,thrift,Haskell,Thrift,我试着用哈斯克尔和节俭打一个简单的乒乓球。但是,它只重复一次,然后就卡住了。我认为问题在于节俭的正确使用,而不是哈斯克尔。可能是冲洗不正确。有没有人有过节俭的经验,可以帮我对如何解决这个问题做出有根据的猜测 服务器: echorequest :: TXT echorequest = TXT { f_TXT_anytxt = Just "Ping" } echoreply :: TXT echoreply = TXT { f_TXT_anytxt = Just "Pong

我试着用哈斯克尔和节俭打一个简单的乒乓球。但是,它只重复一次,然后就卡住了。我认为问题在于节俭的正确使用,而不是哈斯克尔。可能是冲洗不正确。有没有人有过节俭的经验,可以帮我对如何解决这个问题做出有根据的猜测

服务器:

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)
echorequest::TXT
echorequest=TXT{
f_TXT_anytxt=只是“Ping”
}
echoreply::TXT
echoreply=TXT{
f_TXT_anytxt=只是“砰”
}
serverFunc::a->(二进制协议句柄,二进制协议句柄)
->伊奥布尔
serverFunc a(h1,h2)=do
设t1=getTransport h1

dat您的问题是从serverFunc返回False。Haskell将循环直到返回false(根据代码,仅一次)


我认为您的代码片段不足以让任何人帮助您。如何实现
read_TXT
?如果它使用类似于
hGetContents
的内容,那么这就是您的问题-打印无法知道何时收到所有内容,并且会一直阻塞到EOF。这可能就是为什么关闭连接并打开一个新连接会有所帮助。@ThomasM.DuBuisson这是Thrift read函数。在本例中,读取一个结构。