1
- /*!
1
+ /**
2
2
* ExBuffer TCP中的粘包、分包问题的解决方案!
3
- *
4
3
* @update 包结构支持TLV格式 --by xp
5
4
*/
6
5
7
6
const util = require ( 'util' ) ;
8
7
const EventEmitter = require ( 'events' ) ;
9
8
10
- /*
11
- * 构造方法
12
- * @param bufferLength 缓存区长度,默认512 byte
13
- */
9
+ /**
10
+ * 构造方法
11
+ * @param bufferLength 缓存区长度,默认512 byte
12
+ */
14
13
var ExBuffer = function ( bufferLength ) {
15
14
EventEmitter . call ( this ) ; //继承事件类
16
15
@@ -24,56 +23,56 @@ var ExBuffer = function (bufferLength) {
24
23
var _tagLen = 0 ;
25
24
var _tag = 0 ;
26
25
27
- / *
28
- * 指定指令Tag长是int8型即占1个字节(默认不包含tag结构)
29
- */
26
+ /* *
27
+ * 指定指令Tag长是int8型即占1个字节(默认不包含tag结构)
28
+ */
30
29
this . int8Tag = function ( ) {
31
30
_tagLen = 1 ;
32
31
return this ;
33
32
} ;
34
33
35
- / *
36
- * 指定包长是uint32型(默认是ushort型)
37
- */
34
+ /* *
35
+ * 指定包长是uint32型(默认是ushort型)
36
+ */
38
37
this . uint32Head = function ( ) {
39
38
_headLen = 4 ;
40
39
return this ;
41
40
} ;
42
41
43
- / *
44
- * 指定包长是ushort型(默认是ushort型)
45
- */
42
+ /* *
43
+ * 指定包长是ushort型(默认是ushort型)
44
+ */
46
45
this . ushortHead = function ( ) {
47
46
_headLen = 2 ;
48
47
return this ;
49
48
} ;
50
49
51
- / *
52
- * 指定字节序 为Little Endian (默认:Big Endian)
53
- */
50
+ /* *
51
+ * 指定字节序 为Little Endian (默认:Big Endian)
52
+ */
54
53
this . littleEndian = function ( ) {
55
54
_endian = 'L' ;
56
55
return this ;
57
56
} ;
58
57
59
- / *
60
- * 指定字节序 为Big Endian (默认:Big Endian)
61
- */
58
+ /* *
59
+ * 指定字节序 为Big Endian (默认:Big Endian)
60
+ */
62
61
this . bigEndian = function ( ) {
63
62
_endian = 'B' ;
64
63
return this ;
65
64
} ;
66
65
67
- / *
68
- * 送入一端Buffer
69
- */
66
+ /* *
67
+ * 送入一端Buffer
68
+ */
70
69
this . put = function ( buffer , offset , len ) {
71
- if ( offset == undefined ) offset = 0 ;
72
- if ( len == undefined ) len = buffer . length - offset ;
70
+ if ( offset == undefined ) offset = 0 ;
71
+ if ( len == undefined ) len = buffer . length - offset ;
73
72
//buf.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd])
74
73
//当前缓冲区已经不能满足次数数据了
75
- if ( len + getLen ( ) > _buffer . length ) {
76
- var ex = Math . ceil ( ( len + getLen ( ) ) / ( 1024 ) ) ; //每次扩展1kb
74
+ if ( len + getLen ( ) > _buffer . length ) {
75
+ var ex = Math . ceil ( ( len + getLen ( ) ) / 1024 ) ; //每次扩展1kb
77
76
var tmp = new Buffer ( ex * 1024 ) ;
78
77
var exlen = tmp . length - _buffer . length ;
79
78
_buffer . copy ( tmp ) ;
@@ -91,11 +90,11 @@ var ExBuffer = function (bufferLength) {
91
90
}
92
91
_buffer = tmp ;
93
92
}
94
- if ( getLen ( ) == 0 ) {
93
+ if ( getLen ( ) == 0 ) {
95
94
_putOffset = _readOffset = 0 ;
96
95
}
97
96
//判断是否会冲破_buffer尾部
98
- if ( ( _putOffset + len ) > _buffer . length ) {
97
+ if ( ( _putOffset + len ) > _buffer . length ) {
99
98
//分两次存 一部分存在数据后面 一部分存在数据前面
100
99
var len1 = _buffer . length - _putOffset ;
101
100
if ( len1 > 0 ) {
@@ -106,8 +105,8 @@ var ExBuffer = function (bufferLength) {
106
105
var len2 = len - len1 ;
107
106
buffer . copy ( _buffer , 0 , offset , offset + len2 ) ;
108
107
_putOffset = len2 ;
109
- } else {
110
- buffer . copy ( _buffer , _putOffset , offset , offset + len ) ;
108
+ } else {
109
+ buffer . copy ( _buffer , _putOffset , offset , offset + len ) ;
111
110
_putOffset += len ;
112
111
}
113
112
proc ( ) ;
@@ -120,59 +119,59 @@ var ExBuffer = function (bufferLength) {
120
119
//console.log('_putOffset:'+_putOffset);
121
120
//console.log(_buffer);
122
121
count ++ ;
123
- if ( count > 1000 ) break ; //1000次还没读完??
124
- if ( _dlen == 0 ) {
125
- if ( getLen ( ) < ( _headLen + _tagLen ) ) {
126
- break ; //连包头都读不了
122
+ if ( count > 1000 ) break ; //1000次还没读完??
123
+ if ( _dlen == 0 ) {
124
+ if ( getLen ( ) < ( _headLen + _tagLen ) ) {
125
+ break ; //连包头都读不了
127
126
}
128
- if ( _buffer . length - _readOffset >= ( _headLen + _tagLen ) ) {
129
- if ( _tagLen > 0 ) {
130
- if ( _tagLen == 1 ) {
127
+ if ( _buffer . length - _readOffset >= ( _headLen + _tagLen ) ) {
128
+ if ( _tagLen > 0 ) {
129
+ if ( _tagLen == 1 ) {
131
130
_tag = _buffer [ 'readInt8' ] ( _readOffset ) ;
132
131
} else {
133
- _tag = _buffer [ 'readInt' + ( 8 * _tagLen ) + '' + _endian + 'E' ] ( _readOffset ) ;
132
+ _tag = _buffer [ 'readInt' + ( 8 * _tagLen ) + '' + _endian + 'E' ] ( _readOffset ) ;
134
133
}
135
134
}
136
135
_readOffset += _tagLen ;
137
- _dlen = _buffer [ 'readUInt' + ( 8 * _headLen ) + '' + _endian + 'E' ] ( _readOffset ) ;
136
+ _dlen = _buffer [ 'readUInt' + ( 8 * _headLen ) + '' + _endian + 'E' ] ( _readOffset ) ;
138
137
_readOffset += _headLen ;
139
138
} else { //
140
139
var hbuf = new Buffer ( _headLen + _tagLen ) ;
141
140
var rlen = 0 ;
142
- for ( var i = 0 ; i < ( _buffer . length + _tagLen - _readOffset ) ; i ++ ) {
141
+ for ( var i = 0 ; i < ( _buffer . length + _tagLen - _readOffset ) ; i ++ ) {
143
142
hbuf [ i ] = _buffer [ _readOffset ++ ] ;
144
143
rlen ++ ;
145
144
}
146
145
_readOffset = 0 ;
147
- for ( var i = 0 ; i < ( _headLen + _tagLen - rlen ) ; i ++ ) {
146
+ for ( var i = 0 ; i < ( _headLen + _tagLen - rlen ) ; i ++ ) {
148
147
hbuf [ rlen + i ] = _buffer [ _readOffset ++ ] ;
149
148
}
150
- if ( _tagLen > 0 ) {
151
- if ( _tagLen == 1 ) {
149
+ if ( _tagLen > 0 ) {
150
+ if ( _tagLen == 1 ) {
152
151
_tag = hbuf [ 'readInt8' ] ( 0 ) ;
153
152
} else {
154
- _tag = hbuf [ 'readInt' + ( 8 * _tagLen ) + '' + _endian + 'E' ] ( 0 ) ;
153
+ _tag = hbuf [ 'readInt' + ( 8 * _tagLen ) + '' + _endian + 'E' ] ( 0 ) ;
155
154
}
156
155
}
157
- _dlen = hbuf [ 'readUInt' + ( 8 * _headLen ) + '' + _endian + 'E' ] ( _tagLen ) ;
156
+ _dlen = hbuf [ 'readUInt' + ( 8 * _headLen ) + '' + _endian + 'E' ] ( _tagLen ) ;
158
157
}
159
158
}
160
159
161
160
//console.log('_dlen:'+_dlen + ',unreadLen:'+getLen());
162
161
163
- if ( getLen ( ) >= _dlen ) {
162
+ if ( getLen ( ) >= _dlen ) {
164
163
var dbuff = new Buffer ( _dlen ) ;
165
- if ( _readOffset + _dlen > _buffer . length ) {
164
+ if ( _readOffset + _dlen > _buffer . length ) {
166
165
var len1 = _buffer . length - _readOffset ;
167
166
if ( len1 > 0 ) {
168
- _buffer . copy ( dbuff , 0 , _readOffset , _readOffset + len1 ) ;
167
+ _buffer . copy ( dbuff , 0 , _readOffset , _readOffset + len1 ) ;
169
168
}
170
169
171
170
_readOffset = 0 ;
172
171
var len2 = _dlen - len1 ;
173
- _buffer . copy ( dbuff , len1 , _readOffset , _readOffset += len2 ) ;
172
+ _buffer . copy ( dbuff , len1 , _readOffset , _readOffset += len2 ) ;
174
173
} else {
175
- _buffer . copy ( dbuff , 0 , _readOffset , _readOffset += _dlen ) ;
174
+ _buffer . copy ( dbuff , 0 , _readOffset , _readOffset += _dlen ) ;
176
175
}
177
176
try {
178
177
_dlen = 0 ;
@@ -197,13 +196,13 @@ var ExBuffer = function (bufferLength) {
197
196
198
197
//获取现在的数据长度
199
198
function getLen ( ) {
200
- if ( _putOffset >= _readOffset ) {
199
+ if ( _putOffset >= _readOffset ) {
201
200
return _putOffset - _readOffset ;
202
201
}
203
202
return _buffer . length - _readOffset + _putOffset ;
204
203
}
205
204
} ;
206
205
207
- util . inherits ( ExBuffer , EventEmitter ) ; // 继承事件类
206
+ util . inherits ( ExBuffer , EventEmitter ) ; // 继承事件类
208
207
209
- module . exports = exports = ExBuffer ;
208
+ module . exports = ExBuffer ;
0 commit comments