-
Notifications
You must be signed in to change notification settings - Fork 0
/
SampleServer.hs
77 lines (53 loc) · 1.75 KB
/
SampleServer.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
{-# LANGUAGE OverloadedStrings #-}
--
module Main where
import Server.TCP.Public
import qualified Data.ByteString.Lazy as BL
import Data.Binary
import Data.Binary.Get
import Data.Binary.Put
import Data.Connection
import qualified System.IO.Streams as SR
import qualified System.IO.Streams.TCP as TCP
import System.IO.Streams.TCP (TCPConnection)
import System.IO.Streams.Binary
import System.IO
import System.Environment
import qualified Data.Text.Lazy as T
import qualified Data.Text.Lazy.Encoding as T
import Types.SampleMessage
import Network.Socket hiding (close)
import Control.Concurrent.STM
import Control.Concurrent.Async
import Control.Exception
main :: IO ()
main = do
{ [pn] <- getArgs
; let pnum = (read pn) :: PortNumber
; startServer pnum 3 10 (acceptConnAsync simpleAction')
}
-- asdfzxcv
-- Initiates the action, but send an exit message to the
-- client if it encounters an exception.
simpleAction' :: TCPConnection -> IO ()
simpleAction' conn = (simpleAction conn) `onException` (send conn $ encode ServerExit)
-- Decode messages from the client, and act on them appropriately.
simpleAction :: TCPConnection -> IO ()
simpleAction conn = do
{ rslt <- decodeFromStream $ source conn
; case rslt of
{ Nothing -> do
{ send conn $ encode (ServerText "Error: Couldn't decode message.")
; simpleAction conn
}
; (Just (ClientText txt)) -> do
{ send conn $ encode (ServerText $ T.reverse txt)
; simpleAction conn
}
; (Just ClientExit) -> do
-- { send conn $ encode ServerExit -- This causes headaches.
{ putStrLn "Ending connection..."
}
}
}
-- asdfzxcv