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