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.NetClientSocket;
13 
14 import netkit.net.NetSocket;
15 import netkit.net.ServerBootstrap;
16 import netkit.common.Common;
17 import netkit.net.NetClientOptions;
18 
19 import kiss.aio.AsynchronousSocketChannel;
20 import kiss.aio.CompletionHandle;
21 import kiss.aio.task;
22 import kiss.aio.ByteBuffer;
23 
24 import std.stdio;
25 
26 class ConnectHandler : ConnectCompletionHandle {
27     this(NetClientSocket master)
28     {   
29         _master = master;
30     }
31     override void completed( void* attachment) {
32         _master._connectHandler(_master);
33     }
34     override void failed(void* attachment)
35     {
36         _master._connectHandler(null);
37     }
38 private:
39     NetClientSocket _master;
40 }
41 
42 class ReadHandler : ReadCompletionHandle {
43     this(NetClientSocket master)
44     {   
45         _master = master;
46     }
47     override void completed(void* attachment, size_t count , ByteBuffer buffer) {
48         _master._readHandler(buffer);
49         _master._readBuffer.clear();
50     }
51     override void failed(void* attachment) {
52         _master._readHandler(null);
53         _master._readBuffer.clear();
54     }
55 private:
56     NetClientSocket _master;
57 }
58 
59 class WriteHandler : WriteCompletionHandle {
60     this(NetClientSocket master)
61     {   
62         _master = master;
63     }
64     override void completed(void* attachment, size_t count , ByteBuffer buffer) {
65     }
66     override void failed(void* attachment) {
67     }
68 private:
69     NetClientSocket _master;
70 }
71 
72 
73 
74 
75 
76 class NetClientSocket : NetSocket{
77 
78     //读缓存大小
79     public int READ_BUFFER_LEN = 1024*20;
80 
81     this(ServerBootstrap boot)
82     {
83         AsynchronousSocketChannel channel = AsynchronousSocketChannel.open(boot.getGroup(), boot.getGroup().getWorkSelector());
84         this(boot, channel);
85 
86     }
87     
88     this(ServerBootstrap boot, AsynchronousSocketChannel channel)
89     {
90   
91         _clientChannel = channel;
92         _boot = boot;
93         _readBuffer = ByteBuffer.allocate(READ_BUFFER_LEN);
94         _readCompletionHandle = new ReadHandler(this);
95         _writeCompletionHandle = new WriteHandler(this);
96     }
97 
98     public NetClientSocket setConnectHandler(connet_handler handler)
99     {
100         _connectHandler = handler;
101         return this;
102     }
103 
104     public NetClientSocket connect(string ip, int port)
105     {
106         _ip = ip;
107         _port = port;
108         _connectCompletionHandle = new ConnectHandler(this);
109         _clientChannel.connect(ip, cast(ushort)port, _connectCompletionHandle, null);
110         return this;
111     }
112 
113     override public NetSocket write(ByteBuffer data)
114     {   
115 
116         _clientChannel.write(data, _writeCompletionHandle, null);	
117 
118         return this;
119     }
120 
121     override public NetSocket write(string data)
122     {   
123         _clientChannel.write(data, _writeCompletionHandle, null);	
124         return this;
125     }
126 
127 
128 
129     
130 
131     //注册处理接收数据
132     override public NetSocket handler(buffer_handler readHandler)
133     {
134         _readHandler = readHandler;
135         doRead();
136         return this;
137     }
138 
139     public void doRead()
140     {
141         _readBuffer.clear();
142         _clientChannel.read(_readBuffer, _readCompletionHandle, null);
143     }
144 
145 
146     override public NetSocket close() 
147     {
148         _clientChannel.close();
149         return this;
150     }
151 
152 
153 public:
154     ByteBuffer _readBuffer;
155     
156 private:
157     ByteBuffer[] _writeBufferList;
158     
159     AsynchronousSocketChannel _clientChannel;
160     ConnectHandler _connectCompletionHandle;
161     ReadHandler _readCompletionHandle;
162     WriteHandler _writeCompletionHandle;
163 
164 }