修复ws数据包过大粘包的bug

This commit is contained in:
Redkale
2019-03-14 12:32:07 +08:00
parent 8ad919f952
commit e101b79472
2 changed files with 15 additions and 3 deletions

View File

@@ -346,9 +346,15 @@ public final class WebSocketPacket {
*/ */
boolean receiveBody(WebSocket webSocket, ByteBuffer readBuffer) { boolean receiveBody(WebSocket webSocket, ByteBuffer readBuffer) {
int need = receiveLength - receiveCount; int need = receiveLength - receiveCount;
boolean over = readBuffer.remaining() >= need; final int remain = readBuffer.remaining();
boolean over = remain >= need;
this.receiveBuffers = Utility.append(this.receiveBuffers, readBuffer); this.receiveBuffers = Utility.append(this.receiveBuffers, readBuffer);
if (over) parseReceiveMessage(webSocket, this.receiveBuffers); if (over) {
this.receiveCount = this.receiveLength;
parseReceiveMessage(webSocket, this.receiveBuffers);
} else {
this.receiveCount += remain;
}
return over; return over;
} }
@@ -438,6 +444,8 @@ public final class WebSocketPacket {
} }
if (lengthCode == 0x7E) {//0x7E=126 if (lengthCode == 0x7E) {//0x7E=126
length = (int) buffer.getChar(); length = (int) buffer.getChar();
} else if (lengthCode == 0x7F) {//0x7E=127
length = (int) buffer.getLong();
} else { } else {
length = buffer.getInt(); length = buffer.getInt();
} }

View File

@@ -115,7 +115,11 @@ class WebSocketRunner implements Runnable {
webSocket.onOccurException(e, null); webSocket.onOccurException(e, null);
} }
//继续监听消息 //继续监听消息
readBuffer.clear(); if (readBuffer.hasRemaining()) { //exBuffers缓存了
readBuffer = context.pollBuffer();
} else {
readBuffer.clear();
}
if (halfBytes.getValue() != null) { if (halfBytes.getValue() != null) {
readBuffer.put(halfBytes.getValue()); readBuffer.put(halfBytes.getValue());
halfBytes.setValue(null); halfBytes.setValue(null);