From f9d657f802d10fc1a9c73d4ff1512cb31618ca84 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=90=8C=E5=AD=A6=E7=9A=84=E5=8F=AF=E7=88=B1=E5=A5=B3?=
=?UTF-8?q?=E5=8F=8B=E7=B3=96=E7=B3=96?=
Date: Sat, 6 Nov 2021 15:19:25 +0800
Subject: [PATCH 1/2] bugfix:
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. AioQuickClient 中的方法名错误
2. DelimiterFrameDecoder 结束标志中有重复的字节导致的问题
link #I4H4YB 、link #I3VHZ6
---
.../socket/transport/AioQuickClient.java | 6 ++--
.../decoder/DelimiterFrameDecoder.java | 36 ++++++++++++++++---
2 files changed, 34 insertions(+), 8 deletions(-)
diff --git a/aio-core/src/main/java/org/smartboot/socket/transport/AioQuickClient.java b/aio-core/src/main/java/org/smartboot/socket/transport/AioQuickClient.java
index 4a488d33..564df6e1 100644
--- a/aio-core/src/main/java/org/smartboot/socket/transport/AioQuickClient.java
+++ b/aio-core/src/main/java/org/smartboot/socket/transport/AioQuickClient.java
@@ -188,14 +188,14 @@ public final class AioQuickClient {
*
*/
public final void shutdown() {
- showdown0(false);
+ shutdown0(false);
}
/**
* 立即关闭客户端
*/
public final void shutdownNow() {
- showdown0(true);
+ shutdown0(true);
}
/**
@@ -203,7 +203,7 @@ public final class AioQuickClient {
*
* @param flag 是否立即停止
*/
- private void showdown0(boolean flag) {
+ private void shutdown0(boolean flag) {
if (session != null) {
session.close(flag);
session = null;
diff --git a/aio-pro/src/main/java/org/smartboot/socket/extension/decoder/DelimiterFrameDecoder.java b/aio-pro/src/main/java/org/smartboot/socket/extension/decoder/DelimiterFrameDecoder.java
index 2f00e41c..01803295 100644
--- a/aio-pro/src/main/java/org/smartboot/socket/extension/decoder/DelimiterFrameDecoder.java
+++ b/aio-pro/src/main/java/org/smartboot/socket/extension/decoder/DelimiterFrameDecoder.java
@@ -24,6 +24,10 @@ public class DelimiterFrameDecoder implements SmartDecoder {
* 消息结束标志
*/
private byte[] endFLag;
+ /**
+ * 可能是结束标志的数据
+ */
+ private final byte[] exceptFlag;
/**
* 期望本次校验的结束标索引位置
*/
@@ -43,6 +47,7 @@ public class DelimiterFrameDecoder implements SmartDecoder {
this.endFLag = endFLag;
bufferList = new ArrayList<>();
bufferList.add(ByteBuffer.allocate(unitBufferSize));
+ exceptFlag = new byte[endFLag.length];
}
public boolean decode(ByteBuffer byteBuffer) {
@@ -66,11 +71,32 @@ public class DelimiterFrameDecoder implements SmartDecoder {
byte data = byteBuffer.get();
preBuffer.put(data);
if (data != endFLag[exceptIndex]) {
- exceptIndex = 0;
- } else if (++exceptIndex == endFLag.length) {
- preBuffer.flip();
- finishRead = true;
- break;
+ if (exceptIndex > 0) {
+ boolean hasExcept = false;
+ exceptFlag[exceptIndex] = data;
+ int count = exceptIndex;
+ for (int i = 1; i <= count; i++) {
+ for (int j = 0; j < count-i; j++) {
+ if (exceptFlag[i+j] != endFLag[j]) {
+ hasExcept = false;
+ break;
+ }
+ hasExcept = true;
+ }
+ exceptIndex--;
+ System.arraycopy(exceptFlag,i, exceptFlag,0, endFLag.length-i);
+ if (hasExcept) {
+ break;
+ }
+ }
+ }
+ } else {
+ exceptFlag[exceptIndex] = data;
+ if (++exceptIndex == endFLag.length) {
+ preBuffer.flip();
+ finishRead = true;
+ break;
+ }
}
}
--
Gitee
From 26d770441fe8c52b3e4701140a11a104059ce30b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=90=8C=E5=AD=A6=E7=9A=84=E5=8F=AF=E7=88=B1=E5=A5=B3?=
=?UTF-8?q?=E5=8F=8B=E7=B3=96=E7=B3=96?=
Date: Sat, 6 Nov 2021 16:18:09 +0800
Subject: [PATCH 2/2] bugfix:
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. AioQuickClient 中的方法名错误
2. DelimiterFrameDecoder 结束标志中有重复的字节导致的问题
link #I4H4YB 、link #I3VHZ6
---
.../socket/extension/decoder/DelimiterFrameDecoder.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/aio-pro/src/main/java/org/smartboot/socket/extension/decoder/DelimiterFrameDecoder.java b/aio-pro/src/main/java/org/smartboot/socket/extension/decoder/DelimiterFrameDecoder.java
index 01803295..22bbde6a 100644
--- a/aio-pro/src/main/java/org/smartboot/socket/extension/decoder/DelimiterFrameDecoder.java
+++ b/aio-pro/src/main/java/org/smartboot/socket/extension/decoder/DelimiterFrameDecoder.java
@@ -76,18 +76,18 @@ public class DelimiterFrameDecoder implements SmartDecoder {
exceptFlag[exceptIndex] = data;
int count = exceptIndex;
for (int i = 1; i <= count; i++) {
- for (int j = 0; j < count-i; j++) {
- if (exceptFlag[i+j] != endFLag[j]) {
+ System.arraycopy(exceptFlag,1, exceptFlag,0, endFLag.length-1);
+ for (int j = 0; j <= count-i; j++) {
+ if (exceptFlag[j] != endFLag[j]) {
hasExcept = false;
break;
}
hasExcept = true;
}
- exceptIndex--;
- System.arraycopy(exceptFlag,i, exceptFlag,0, endFLag.length-i);
if (hasExcept) {
break;
}
+ exceptIndex--;
}
}
} else {
--
Gitee