1 module neton.network.ServerHandler; 2 3 import hunt.logging; 4 import hunt.util.Serialize; 5 6 import hunt.net; 7 import hunt.raft; 8 9 import core.stdc.string; 10 11 import neton.network.Interface; 12 13 import std.bitmanip; 14 import std.stdint; 15 16 class ServerHandler 17 { 18 19 enum PACK_HEAD_LEN = 4; 20 21 this(MessageReceiver receiver) 22 { 23 // this.sock = sock; 24 this.receiver = receiver; 25 // sock.handler((in ubyte[] data) { onRead(data); }); 26 // sock.closeHandler(() { onClose(); }); 27 } 28 29 void onRead(in ubyte[] data) 30 { 31 Message[] msgs; 32 int index = 0; 33 int length = cast(int) data.length; 34 int used; 35 while (index < length) 36 { 37 int left = length - index; 38 if (headLen < PACK_HEAD_LEN) 39 { 40 if (left >= PACK_HEAD_LEN - headLen) 41 { 42 used = PACK_HEAD_LEN - headLen; 43 header[headLen .. headLen + used] = data[index .. index + used]; 44 index += used; 45 headLen += used; 46 msgLen = bigEndianToNative!int32_t(header); 47 buffer.length = 0; 48 if (msgLen == 0) 49 { 50 msgs ~= unserialize!Message(cast(byte[]) buffer); 51 headLen = 0; 52 } 53 } 54 else 55 { 56 header[headLen .. headLen + left] = data[index .. index + left]; 57 index += left; 58 headLen += left; 59 } 60 } 61 else 62 { 63 if (left >= msgLen - cast(int) buffer.length) 64 { 65 used = msgLen - cast(int) buffer.length; 66 buffer ~= data[index .. index + used]; 67 index += used; 68 msgs ~= unserialize!Message(cast(byte[]) buffer); 69 headLen = 0; 70 } 71 else 72 { 73 buffer ~= data[index .. index + left]; 74 index += left; 75 } 76 } 77 78 } 79 80 foreach (m; msgs) 81 { 82 // logDebug("recv a message " , m); 83 receiver.step(m); 84 } 85 86 } 87 88 void onClose() 89 { 90 91 } 92 93 // NetSocket sock; 94 95 int msgLen; 96 ubyte[] buffer; 97 int headLen = 0; 98 ubyte[PACK_HEAD_LEN] header; 99 MessageReceiver receiver; 100 }