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] 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