1{-# LANGUAGE NamedFieldPuns #-}
4import Network.Transport
5import qualified Network.Transport.MVar
6import qualified Network.Transport.Pipes
7import Network.Transport.TCP (mkTransport, TCPConfig (..))
9import Control.Concurrent
12import qualified Data.ByteString.Lazy.Char8 as BS
17-------------------------------------------
19{- Run a demo above with one of these tranpsort shorthands like this:
23mvar = return Network.Transport.MVar.mkTransport
24pipes = return Network.Transport.Pipes.mkTransport
27-------------------------------------------
28-- Example programs using backend directly
31-- | Check if multiple messages can be sent on the same connection.
32demo0 :: IO Transport -> IO ()
36 (sourceAddr, targetEnd) <- newConnection trans
38 forkIO $ logServer "logServer" targetEnd
41 sourceEnd <- connect sourceAddr
43 mapM_ (\n -> send sourceEnd [BS.pack ("hello " ++ show n)]) [1 .. 10]
49-- | Check endpoint serialization and deserialization.
50demo1 :: IO Transport -> IO ()
54 (sourceAddr, targetEnd) <- newConnection trans
56 forkIO $ logServer "logServer" targetEnd
59 sourceEnd <- connect sourceAddr
61 -- This use of Just is slightly naughty
62 let Just sourceAddr' = deserialize trans (serialize sourceAddr)
63 sourceEnd' <- connect sourceAddr'
65 send sourceEnd [BS.pack "hello 1"]
66 send sourceEnd' [BS.pack "hello 2"]
71-- | Check that messages can be sent before receive is set up.
72demo2 :: IO Transport -> IO ()
76 (sourceAddr, targetEnd) <- newConnection trans
77 sourceEnd <- connect sourceAddr
79 forkIO $ send sourceEnd [BS.pack "hello 1"]
82 forkIO $ logServer "logServer" targetEnd
87-- | Check that two different transports can be created.
88demo3 :: IO Transport -> IO ()
93 (sourceAddr1, targetEnd1) <- newConnection trans1
94 (sourceAddr2, targetEnd2) <- newConnection trans2
96 threadId1 <- forkIO $ logServer "logServer1" targetEnd1
97 threadId2 <- forkIO $ logServer "logServer2" targetEnd2
99 sourceEnd1 <- connect sourceAddr1
100 sourceEnd2 <- connect sourceAddr2
102 send sourceEnd1 [BS.pack "hello1"]
103 send sourceEnd2 [BS.pack "hello2"]
109 closeTransport trans1
110 closeTransport trans2
113-- | Check that two different connections on the same transport can be created.
114demo4 :: IO Transport -> IO ()
118 (sourceAddr1, targetEnd1) <- newConnection trans
119 (sourceAddr2, targetEnd2) <- newConnection trans
121 threadId1 <- forkIO $ logServer "logServer1" targetEnd1
122 threadId2 <- forkIO $ logServer "logServer2" targetEnd2
124 sourceEnd1 <- connect sourceAddr1
125 sourceEnd2 <- connect sourceAddr2
127 send sourceEnd1 [BS.pack "hello1"]
128 send sourceEnd2 [BS.pack "hello2"]
136--------------------------------------------------------------------------------
138logServer :: String -> TargetEnd -> IO ()
139logServer name targetEnd = forever $ do
140 x <- receive targetEnd
141 trace (name ++ " rcvd: " ++ show x) $ return ()
145 return$ do cnt <- readIORef cntr
146 writeIORef cntr (cnt+1)
147 mkTransport (TCPConfig undefined "127.0.0.1" (show (off + cnt)))
149--------------------------------------------------------------------------------
151runWAllTranports :: (IO Transport -> IO ()) -> Int -> IO ()
152runWAllTranports demo offset = do
153 putStrLn "------------------------------------------------------------"
154 putStrLn " MVAR transport:"
156 putStrLn "\n TCP transport:"
158 putStrLn "\n PIPES transport:"
165 runWAllTranports demo0 0
167 runWAllTranports demo1 10
169 runWAllTranports demo2 20
171 runWAllTranports demo3 30
173 runWAllTranports demo4 40
175 threadDelay (300 * 1000)
176 putStrLn "Done with all demos!"
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list