1 module client; 2 3 import hunt.net; 4 import hunt.net.codec.textline; 5 import hunt.logging; 6 import hunt.String; 7 import hunt.event.EventLoop; 8 9 10 import std.format; 11 import std.stdio; 12 13 import core.memory; 14 import core.thread; 15 import core.time; 16 17 18 // enum Host = "127.0.0.1"; 19 enum Host = "10.1.23.222"; 20 enum Port = 8090; 21 22 string requestString = "GET / HTTP/1.1\r\nAccept: */*\r\nHost: 10.1.23.222:80\r\nConnection: keep-alive\r\n\r\n"; 23 24 import std.parallelism; 25 26 void main() { 27 runClientTest(); 28 // runEventLoopTest(); 29 30 // runThreadTest(); 31 // runThreadPoolTest(); 32 } 33 34 35 void runThreadPoolTest() { 36 import std.parallelism; 37 Duration dur = 5.seconds; 38 tracef("Waiting for %s seconds", dur); 39 Thread.sleep(dur); 40 41 MonoTime startTime = MonoTime.currTime; 42 43 // Thread.sleep(5.seconds); 44 45 tracef("Thread: %d", Thread.getAll().length); 46 47 foreach(int index; 0..20) { 48 auto testTask = task(() { 49 try { 50 tracef("runing Thread: %d", Thread.getAll().length); 51 Thread.sleep(5.seconds); 52 warningf("ending Thread: %d", Thread.getAll().length); 53 } catch (Throwable t) { 54 warning(t.msg); 55 version(HUNT_DEBUG) warning(t.toString()); 56 } 57 }); 58 59 // testTask.executeInNewThread(); 60 taskPool.put(testTask); 61 62 Thread.sleep(2.seconds); 63 tracef("starting %d", index); 64 } 65 66 getchar(); 67 68 tracef("Thread: %d", Thread.getAll().length); 69 } 70 71 void runThreadTest() { 72 Duration dur = 5.seconds; 73 tracef("Waiting for %s seconds", dur); 74 Thread.sleep(dur); 75 76 MonoTime startTime = MonoTime.currTime; 77 78 // Thread.sleep(5.seconds); 79 80 tracef("Thread: %d", Thread.getAll().length); 81 82 foreach(int index; 0..200) { 83 Thread _workThread = new Thread(() { 84 tracef("runing Thread: %d", Thread.getAll().length); 85 // Thread.sleep(5.seconds); 86 warningf("ending Thread: %d", Thread.getAll().length); 87 88 }); 89 90 // _workThread.isDaemon = true; 91 _workThread.start(); 92 93 Thread.sleep(2.seconds); 94 tracef("starting %d", index); 95 } 96 97 getchar(); 98 99 100 // GC.collect(); 101 // GC.minimize(); 102 103 // getchar(); 104 105 tracef("Thread: %d", Thread.getAll().length); 106 } 107 108 // void runThreadTest_Bug() { 109 // Duration dur = 5.seconds; 110 // tracef("Waiting for %s seconds", dur); 111 // Thread.sleep(dur); 112 113 // MonoTime startTime = MonoTime.currTime; 114 115 // // Thread.sleep(5.seconds); 116 117 // tracef("Thread: %d", Thread.getAll().length); 118 119 // foreach(int index; 0..2000) { 120 // Thread _workThread = new Thread(() { 121 // try { 122 // tracef("runing Thread: %d", Thread.getAll().length); 123 // // Thread.sleep(5.seconds); 124 // warningf("ending Thread: %d", Thread.getAll().length); 125 // } catch (Throwable t) { 126 // warning(t.msg); 127 // version(HUNT_DEBUG) warning(t.toString()); 128 // } 129 // }); 130 131 // _workThread.start(); 132 133 // // Thread.sleep(2.seconds); 134 // tracef("starting %d", index); 135 // } 136 137 // getchar(); 138 139 // tracef("Thread: %d", Thread.getAll().length); 140 // } 141 142 void runEventLoopTest() { 143 Duration dur = 5.seconds; 144 tracef("Waiting for %s seconds", dur); 145 Thread.sleep(dur); 146 147 MonoTime startTime = MonoTime.currTime; 148 149 // Thread.sleep(5.seconds); 150 151 foreach(int index; 0..50) { 152 153 EventLoop loop = NetUtil.buildEventLoop(); 154 // Thread.sleep(5.seconds); 155 156 loop.stop(); 157 infof("stoppped => %d", index); 158 Thread.sleep(2.seconds); 159 } 160 161 infof("Press any key to exit"); 162 getchar(); 163 } 164 165 void runClientTest() { 166 167 Duration dur = 5.seconds; 168 tracef("Waiting for %s seconds", dur); 169 Thread.sleep(dur); 170 171 MonoTime startTime = MonoTime.currTime; 172 173 // Thread.sleep(5.seconds); 174 175 foreach(int index; 0..5) { 176 testClient(index + 1); 177 // Thread.sleep(10.seconds); 178 Thread.sleep(500.msecs); 179 } 180 181 MonoTime endTime = MonoTime.currTime; 182 warningf("elapsed: %s", endTime - startTime); 183 184 // infof("Press any key to run GC Collection"); 185 // getchar(); 186 187 // // loop.stop(); 188 // GC.collect(); 189 // GC.minimize(); 190 191 infof("Press any key to exit"); 192 getchar(); 193 } 194 195 196 197 void testClient(int index) { 198 199 tracef("testing %d ...", index); 200 scope(exit) { 201 infof("%d done.", index); 202 } 203 204 import core.sync.condition; 205 import core.sync.mutex; 206 207 208 Mutex locker = new Mutex(); 209 Condition cond = new Condition(locker); 210 bool isWaiting = false; 211 212 NetClient client; 213 EventLoop loop = NetUtil.buildEventLoop(); 214 client = new NetClientImpl(loop, new NetClientOptions()); 215 216 // dfmt off 217 client.setHandler(new class NetConnectionHandler { 218 219 override void connectionOpened(Connection connection) { 220 // version(HUNT_DEBUG) infof("Connection created: %s", connection.getRemoteAddress()); 221 222 // connection.write("Hi, I'm client"); 223 connection.write(requestString); 224 } 225 226 override void connectionClosed(Connection connection) { 227 // version(HUNT_DEBUG) infof("Connection closed: %s", connection.getRemoteAddress()); 228 229 // client.close(); 230 231 locker.lock(); 232 if(isWaiting) cond.notify(); 233 locker.unlock(); 234 } 235 236 override DataHandleStatus messageReceived(Connection connection, Object message) { 237 string str = format("data received: %s", message.toString()); 238 tracef(str); 239 240 import hunt.io.ByteBuffer; 241 ByteBuffer buffer = cast(ByteBuffer)message; 242 string content = cast(string)buffer.peekRemaining(); 243 // warning(content); 244 245 // if(content == "quit") { 246 // client.close(); 247 // } 248 249 client.close(); 250 251 return DataHandleStatus.Done; 252 } 253 254 override void exceptionCaught(Connection connection, Throwable t) { 255 warning(t); 256 } 257 258 override void failedOpeningConnection(int connectionId, Throwable t) { 259 warning(t); 260 client.close(); 261 } 262 263 override void failedAcceptingConnection(int connectionId, Throwable t) { 264 warning(t); 265 } 266 }).connect(Host, Port); 267 268 // dfmt on 269 270 import core.time; 271 272 locker.lock(); 273 isWaiting = true; 274 cond.wait(100.msecs); 275 locker.unlock(); 276 277 // getchar(); 278 }