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 }