1 /*
2  * NetKit - This library contains tcp / http / http2 / websocket servers and clients.
3  *
4  * Copyright (C) 2015-2017  Shanghai Putao Technology Co., Ltd
5  *
6  * Developer: HuntLabs
7  *
8  * Licensed under the Apache-2.0 License.
9  *
10  */
11 
12 module netkit.net.NetServerSocket;
13 
14 import netkit.net.NetSocket;
15 import netkit.net.ServerBootstrap;
16 import netkit.net.NetClientSocket;
17 import netkit.common.Common;
18 
19 import kiss.aio.AsynchronousServerSocketChannel;
20 import kiss.aio.AsynchronousSocketChannel;
21 import kiss.aio.CompletionHandle;
22 import kiss.aio.ByteBuffer;
23 
24 class AcceptHandler : AcceptCompletionHandle {
25 
26     this(NetServerSocket master)
27     {   
28         _master = master;
29     }
30     override void completed(void* attachment, AsynchronousSocketChannel result)
31     {
32         NetClientSocket client = new NetClientSocket(_master._boot, result);
33         _master._connectHandler(client);
34     }
35     override void failed(void* attachment)
36     {
37         _master._connectHandler(null);
38     }
39 private:
40     NetServerSocket _master;
41 }
42 
43 
44 class NetServerSocket : NetSocket {
45 
46     this(ServerBootstrap boot)
47     {
48         _boot = boot;
49         _serverChannel = AsynchronousServerSocketChannel.open(boot.getGroup());
50         _acceptHandler = new AcceptHandler(this);
51         
52     }
53     public NetServerSocket setConnectHandler(connet_handler handler)
54     {
55         _connectHandler = handler;
56         return this;
57     }
58     public NetServerSocket bind(string ip, int port)
59     {
60         _ip = ip;
61         _port = port;
62         _serverChannel.bind(ip, cast(ushort)port);
63         _serverChannel.accept(null, _acceptHandler);   
64         return this;
65     }
66 
67     override public NetSocket handler(buffer_handler readHandler) { return this; }
68     override public NetSocket write(ByteBuffer data) { return this; }
69     override public NetSocket write(string data) { return this; }
70     override public NetSocket close() { return this; }
71 
72 
73 private:
74     AsynchronousServerSocketChannel _serverChannel;
75     AcceptHandler _acceptHandler;
76     
77 
78 }