2011-11-23 22 views
27

Tôi đang cố gắng làm một Ping Pong đơn giản bằng cách sử dụng Haskell và Tiết kiệm. Tuy nhiên, nó chỉ có một sự lặp lại và sau đó nó bị mắc kẹt. Tôi giả định rằng vấn đề là trong việc sử dụng chính xác (trong) tiết kiệm hơn là trong Haskell. Có lẽ một cái gì đó không phải là đỏ bừng một cách chính xác. Có ai có kinh nghiệm với Tiết kiệm, ai có thể giúp tôi đoán được cách sửa lỗi này?Ping Pong với Haskell và Thrift bị kẹt

Server:

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" 

Chủ đầu tư:

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

Tôi không nghĩ rằng các đoạn mã của bạn là đủ cho bất cứ ai để giúp bạn. 'Read_TXT' được triển khai như thế nào? Nếu nó sử dụng một cái gì đó như 'hGetContents' thì đó là vấn đề của bạn - bản in sẽ không biết khi nào tất cả các nội dung đã được nhận và sẽ chặn cho đến EOF. Đó có lẽ là lý do tại sao đóng kết nối và mở một kết nối mới giúp. –

+0

@ ThomasM.DuBuisson Đây là chức năng đọc tiết kiệm. Trong trường hợp này để đọc một cấu trúc. –

Trả lời

Các vấn đề liên quan