Mercurial > projects > dreactor
comparison test/chatserver.d @ 13:8c9b1276f623 default tip
bug fixes
author | rick@minifunk |
---|---|
date | Sat, 20 Sep 2008 18:33:11 -0400 |
parents | d6a3cfe7c3de |
children |
comparison
equal
deleted
inserted
replaced
12:d6a3cfe7c3de | 13:8c9b1276f623 |
---|---|
1 | 1 |
2 module chatserver; | 2 module chatserver; |
3 | |
4 import tango.io.Stdout; | |
5 import tango.io.Console; | |
6 import tango.util.container.CircularList; | |
7 import tango.util.log.Log; | |
8 import tango.net.Socket; | |
3 | 9 |
4 import dreactor.core.Vat; | 10 import dreactor.core.Vat; |
5 import dreactor.core.Task; | 11 import dreactor.core.Task; |
6 import dreactor.protocol.TcpProvider; | 12 import dreactor.protocol.TcpProvider; |
13 import dreactor.transport.AsyncSocketConduit; | |
7 | 14 |
15 typedef Message ChildTCPRequest; | |
16 Logger log; | |
8 | 17 |
9 class ChatConnectionTask : Task | 18 class ChatConnectionTask : Task |
10 { | 19 { |
11 public | 20 public |
21 this(TcpProvider tcpclient) | |
22 { | |
23 super(tcpclient); | |
24 } | |
25 | |
26 enum { | |
27 StdIn = 100, | |
28 RemoteClosed | |
29 } | |
12 | 30 |
13 void run() | 31 void run() |
14 { | 32 { |
33 running = true; | |
15 Message msg; | 34 Message msg; |
16 while (msg = receive()) | 35 while (running) |
17 { | 36 { |
37 msg = receive(); | |
18 switch(msg.type) | 38 switch(msg.type) |
19 { | 39 { |
20 case TCP_PROVIDER_RECEIVE: | 40 case TcpProvider.Receive: |
21 //Stdout(cast(char[]) msg.payload); | 41 Stdout(cast(char*) msg.payload); |
22 break; | 42 break; |
23 case TCP_PROVIDER_SEND_COMPLETE: | 43 case TcpProvider.SendComplete: |
24 break; | 44 break; |
25 case TCP_PROVIDER_REMOTE_CLOSED: | 45 case TcpProvider.RemoteClosed: |
26 Stdout("--- Remote host closed connection \n"); | 46 log.trace("--- Remote host closed connection \n"); |
27 break; | 47 break; |
28 default: | 48 default: |
29 Stdout("Unknown message received\n"); | 49 log.trace("Unknown message received\n"); |
30 } | 50 } |
31 } | |
32 em.stopNow(); | |
33 } | |
34 | |
35 void send(char[] buf) | |
36 { | |
37 tcp.send(buf); | |
38 } | |
39 | |
40 static CircularList!(ChatConnectionTask!( | |
41 } | |
42 | |
43 | |
44 int main(int argc, char[][] argv) | |
45 { | |
46 auto vat = new Vat; | |
47 | |
48 void listentask(Message msg) | |
49 { | |
50 switch(msg.type) | |
51 { | |
52 case TCP_PROVIDER_CONNECT: | |
53 AsyncSocketConduit cond = cast(AsyncSocketConduit) msg.payload; | |
54 auto tsk = ChatConnectionTask(new TcpProvider(cond)); | |
55 vat.addTask(tsk); | |
56 break; | |
57 default: | |
58 Stdout("Unknown message received\n"); | |
59 } | 51 } |
60 } | 52 } |
61 | 53 |
54 private | |
55 bool running; | |
56 } | |
62 | 57 |
63 auto provider = new TcpProvider(new IPv4Address("localhost", 5555), vat); | 58 class ListenerTask : Task |
64 auto srvtsk = new Task(&listentask, provider); | 59 { |
65 vat.addTask(task, client); | 60 this(TcpProvider tcpclient) |
61 { | |
62 super(tcpclient); | |
63 } | |
64 void run() | |
65 { | |
66 Message msg; | |
67 running = true; | |
68 while (running) | |
69 { | |
70 msg = receive(); | |
71 auto children = new CircularList!(ChatConnectionTask); | |
72 switch(msg.type) | |
73 { | |
74 case TcpProvider.NewConnection: | |
75 AsyncSocketConduit cond = cast(AsyncSocketConduit) msg.payload; | |
76 log.trace("new conduit : {}", cast(uint) cond); | |
77 auto provider = new TcpProvider(cond); | |
78 auto tsk = new ChatConnectionTask(new TcpProvider(cond)); | |
79 children.append(tsk); | |
80 log.trace("accepted connection"); | |
81 break; | |
82 case ChatConnectionTask.StdIn: | |
83 char[] inbuf = (cast(char*) msg.payload)[0 .. msg.info]; | |
84 break; | |
85 case ChatConnectionTask.RemoteClosed: | |
86 break; | |
87 default: | |
88 log.trace("Unknown message received"); | |
89 } | |
90 } | |
91 } | |
92 private | |
93 bool running; | |
66 } | 94 } |
95 | |
96 int main(char[][] args) | |
97 { | |
98 log = Log.lookup("dreactor.chatserver"); | |
99 auto provider = new TcpProvider(new IPv4Address("localhost", 5555), true); | |
100 auto srvtsk = new ListenerTask(provider); | |
101 return 0; | |
102 } |