Mercurial > projects > dreactor
view test/chatserver.d @ 13:8c9b1276f623 default tip
bug fixes
author | rick@minifunk |
---|---|
date | Sat, 20 Sep 2008 18:33:11 -0400 |
parents | d6a3cfe7c3de |
children |
line wrap: on
line source
module chatserver; import tango.io.Stdout; import tango.io.Console; import tango.util.container.CircularList; import tango.util.log.Log; import tango.net.Socket; import dreactor.core.Vat; import dreactor.core.Task; import dreactor.protocol.TcpProvider; import dreactor.transport.AsyncSocketConduit; typedef Message ChildTCPRequest; Logger log; class ChatConnectionTask : Task { public this(TcpProvider tcpclient) { super(tcpclient); } enum { StdIn = 100, RemoteClosed } void run() { running = true; Message msg; while (running) { msg = receive(); switch(msg.type) { case TcpProvider.Receive: Stdout(cast(char*) msg.payload); break; case TcpProvider.SendComplete: break; case TcpProvider.RemoteClosed: log.trace("--- Remote host closed connection \n"); break; default: log.trace("Unknown message received\n"); } } } private bool running; } class ListenerTask : Task { this(TcpProvider tcpclient) { super(tcpclient); } void run() { Message msg; running = true; while (running) { msg = receive(); auto children = new CircularList!(ChatConnectionTask); switch(msg.type) { case TcpProvider.NewConnection: AsyncSocketConduit cond = cast(AsyncSocketConduit) msg.payload; log.trace("new conduit : {}", cast(uint) cond); auto provider = new TcpProvider(cond); auto tsk = new ChatConnectionTask(new TcpProvider(cond)); children.append(tsk); log.trace("accepted connection"); break; case ChatConnectionTask.StdIn: char[] inbuf = (cast(char*) msg.payload)[0 .. msg.info]; break; case ChatConnectionTask.RemoteClosed: break; default: log.trace("Unknown message received"); } } } private bool running; } int main(char[][] args) { log = Log.lookup("dreactor.chatserver"); auto provider = new TcpProvider(new IPv4Address("localhost", 5555), true); auto srvtsk = new ListenerTask(provider); return 0; }