Mercurial > projects > dreactor
diff 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 diff
--- a/test/chatserver.d Wed Aug 27 00:47:33 2008 -0400 +++ b/test/chatserver.d Sat Sep 20 18:33:11 2008 -0400 @@ -1,66 +1,102 @@ 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; - while (msg = receive()) + running = true; + while (running) { + msg = receive(); + auto children = new CircularList!(ChatConnectionTask); switch(msg.type) { - case TCP_PROVIDER_RECEIVE: - //Stdout(cast(char[]) msg.payload); + 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 TCP_PROVIDER_SEND_COMPLETE: + case ChatConnectionTask.StdIn: + char[] inbuf = (cast(char*) msg.payload)[0 .. msg.info]; break; - case TCP_PROVIDER_REMOTE_CLOSED: - Stdout("--- Remote host closed connection \n"); + case ChatConnectionTask.RemoteClosed: break; default: - Stdout("Unknown message received\n"); + log.trace("Unknown message received"); } } - em.stopNow(); } - - void send(char[] buf) - { - tcp.send(buf); - } - - static CircularList!(ChatConnectionTask!( +private + bool running; } - -int main(int argc, char[][] argv) +int main(char[][] args) { - auto vat = new Vat; - - void listentask(Message msg) - { - switch(msg.type) - { - case TCP_PROVIDER_CONNECT: - AsyncSocketConduit cond = cast(AsyncSocketConduit) msg.payload; - auto tsk = ChatConnectionTask(new TcpProvider(cond)); - vat.addTask(tsk); - break; - default: - Stdout("Unknown message received\n"); - } - } - - - auto provider = new TcpProvider(new IPv4Address("localhost", 5555), vat); - auto srvtsk = new Task(&listentask, provider); - vat.addTask(task, client); + log = Log.lookup("dreactor.chatserver"); + auto provider = new TcpProvider(new IPv4Address("localhost", 5555), true); + auto srvtsk = new ListenerTask(provider); + return 0; }