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 }