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 4a488d33bcef39857a8f74db86ee126ce1eea23c..564df6e1db6afa34334d692f63f0b8f1e373829e 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 2f00e41cb98d63f913d8aa1158345895d8fb3196..01803295a99cc3f4510cb2e6f366d65b27098f6d 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; + } } }