2011-11-23 10 views
27

अटक गया है मैं हास्केल और थ्रिफ्ट का उपयोग करके एक साधारण पिंग पोंग करने की कोशिश कर रहा हूं। हालांकि, यह केवल एक दोहराव करता है और फिर यह अटक जाता है। मुझे लगता है कि समस्या हास्केल की बजाय बहाव के सही उपयोग (इन) में है। शायद कुछ ठीक से फ्लश नहीं किया जाता है। क्या कोई भी थ्रिफ्ट के साथ अनुभव वाला है जो इसे ठीक करने के तरीके पर शिक्षित अनुमान बनाने में मेरी मदद कर सकता है?हास्केल और थ्रिफ्ट के साथ पिंग पोंग

सर्वर:

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

मुझे नहीं लगता कि अपने कोड के टुकड़े पर्याप्त किसी को मदद करने के लिए कर रहे हैं। 'Read_TXT' कैसे कार्यान्वित किया जाता है? यदि यह 'एचजीएटीकंट्स' जैसी कुछ का उपयोग करता है तो यह आपकी समस्या है - प्रिंट नहीं पता होगा कि सभी सामग्री कब प्राप्त हुई है और ईओएफ तक अवरुद्ध होगी। शायद यही कारण है कि कनेक्शन बंद करना और एक नया खोलना मदद करता है। –

+0

@ थॉमसएम। डूबुइसन यह थ्रिफ्ट रीड फ़ंक्शन है। इस मामले में एक संरचना को पढ़ने के लिए। –

उत्तर

संबंधित मुद्दे