1 module hunt.imf.io.server; 2 3 import hunt.net; 4 5 import hunt.imf.core.dispatcher; 6 import hunt.imf.protocol.parser; 7 import hunt.imf.protocol.packet; 8 import hunt.imf.io.context; 9 10 11 12 class Server 13 { 14 this(Dispatcher dispatcher , string ns = "") 15 { 16 _namespace = ns; 17 _dispatcher = dispatcher; 18 _server = NetUtil.createNetServer!(ServerThreadMode.Single)(); 19 } 20 21 void listen(int port , string host = "127.0.0.1") 22 { 23 alias Server = hunt.net.Server.Server; 24 _server.listen(host , port , (Result!Server result){ 25 if(result.failed()) 26 throw result.cause(); 27 28 }); 29 _server.connectionHandler((NetSocket sock){ 30 auto tcp = cast(AsynchronousTcpSession)sock; 31 auto context = new Context(_namespace , sock); 32 tcp.attachObject(context); 33 if(_open !is null){ 34 _open(context); 35 } 36 sock.closeHandler((){ 37 if(_close !is null) 38 _close(context); 39 }); 40 sock.handler( 41 (in ubyte[] data){ 42 auto context = cast(Context)tcp.getAttachment(); 43 auto list = context.parser.consume(cast(byte[])data); 44 foreach(p ; list) 45 _dispatcher.dispatch(context , p); 46 } 47 ); 48 }); 49 } 50 51 void stop() { 52 _server.stop(); 53 } 54 55 void setOpenHandler(OpenHandler handler) 56 { 57 _open = handler; 58 } 59 60 void setCloseHandler(CloseHandler handler){ 61 _close = handler; 62 } 63 64 65 private: 66 string _namespace; 67 Dispatcher _dispatcher; 68 AbstractServer _server; 69 OpenHandler _open; 70 CloseHandler _close; 71 }