12
|
1
|
7
|
2 module chatserver;
|
|
3
|
13
|
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;
|
|
9
|
12
|
10 import dreactor.core.Vat;
|
|
11 import dreactor.core.Task;
|
|
12 import dreactor.protocol.TcpProvider;
|
13
|
13 import dreactor.transport.AsyncSocketConduit;
|
7
|
14
|
13
|
15 typedef Message ChildTCPRequest;
|
|
16 Logger log;
|
12
|
17
|
|
18 class ChatConnectionTask : Task
|
|
19 {
|
|
20 public
|
13
|
21 this(TcpProvider tcpclient)
|
|
22 {
|
|
23 super(tcpclient);
|
|
24 }
|
7
|
25
|
13
|
26 enum {
|
|
27 StdIn = 100,
|
|
28 RemoteClosed
|
|
29 }
|
|
30
|
|
31 void run()
|
|
32 {
|
|
33 running = true;
|
|
34 Message msg;
|
|
35 while (running)
|
|
36 {
|
|
37 msg = receive();
|
|
38 switch(msg.type)
|
|
39 {
|
|
40 case TcpProvider.Receive:
|
|
41 Stdout(cast(char*) msg.payload);
|
|
42 break;
|
|
43 case TcpProvider.SendComplete:
|
|
44 break;
|
|
45 case TcpProvider.RemoteClosed:
|
|
46 log.trace("--- Remote host closed connection \n");
|
|
47 break;
|
|
48 default:
|
|
49 log.trace("Unknown message received\n");
|
|
50 }
|
|
51 }
|
|
52 }
|
|
53
|
|
54 private
|
|
55 bool running;
|
|
56 }
|
|
57
|
|
58 class ListenerTask : Task
|
|
59 {
|
|
60 this(TcpProvider tcpclient)
|
|
61 {
|
|
62 super(tcpclient);
|
|
63 }
|
12
|
64 void run()
|
|
65 {
|
|
66 Message msg;
|
13
|
67 running = true;
|
|
68 while (running)
|
12
|
69 {
|
13
|
70 msg = receive();
|
|
71 auto children = new CircularList!(ChatConnectionTask);
|
12
|
72 switch(msg.type)
|
|
73 {
|
13
|
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");
|
12
|
81 break;
|
13
|
82 case ChatConnectionTask.StdIn:
|
|
83 char[] inbuf = (cast(char*) msg.payload)[0 .. msg.info];
|
12
|
84 break;
|
13
|
85 case ChatConnectionTask.RemoteClosed:
|
12
|
86 break;
|
|
87 default:
|
13
|
88 log.trace("Unknown message received");
|
12
|
89 }
|
|
90 }
|
|
91 }
|
13
|
92 private
|
|
93 bool running;
|
7
|
94 }
|
|
95
|
13
|
96 int main(char[][] args)
|
12
|
97 {
|
13
|
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;
|
12
|
102 }
|