2011-11-23 12 views
27

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) 
+3

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. –

+0

@ ThomasM.DuBuisson Jest to funkcja czytania Thrift. W tym przypadku, aby przeczytać jedną strukturę. –

Odpowiedz