timberc-1.0.1: examples/EchoServer2.t
module EchoServer2 where
import POSIX
import Counter
port = Port 12345
root env = class
clients = new counter
log str = action
env.stdout.write ('[':str ++ "]\n")
result action
case parse (env.argv!1) of
Right n -> env.inet.tcp.listen port (server n clients log)
_ -> env.stdout.write "usage: EchoServer n, where n is number of concurrent clients\n"
env.exit 1
server :: Int -> Counter -> (String -> Action) -> Socket -> Class Connection
server maxClients clients log sock = class
n := 1
p = show sock.remoteHost
echo str = action
sock.outFile.write (show n ++"> "++str)
n := n+1
close = request
clients.decr
log (p ++ " closing")
result ()
neterror str = log ("Neterror: "++str)
established = action
cl <- clients.value
if cl < maxClients then
clients.incr
log ("Connected from " ++ p)
sock.inFile.installR echo
else
sock.outFile.write "Server busy"
log ("Refused " ++ p)
sock.close
result Connection{..}