From e276096bf38cede49e0a14f869d932264453744d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9C=B0=E5=B9=B3=E7=BA=BF?= <22250530@qq.com> Date: Mon, 29 Jun 2015 11:28:48 +0800 Subject: [PATCH] --- .../redkale/net/http/WebSocketRunner.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/com/wentch/redkale/net/http/WebSocketRunner.java b/src/com/wentch/redkale/net/http/WebSocketRunner.java index a179a0279..58e272c43 100644 --- a/src/com/wentch/redkale/net/http/WebSocketRunner.java +++ b/src/com/wentch/redkale/net/http/WebSocketRunner.java @@ -64,23 +64,37 @@ public class WebSocketRunner implements Runnable { if (channel.isOpen()) { channel.read(readBuffer, null, new CompletionHandler() { + private ByteBuffer recentExBuffer; + //当接收的数据流长度大于ByteBuffer长度时, 则需要额外的ByteBuffer 辅助; private final List readBuffers = new ArrayList<>(); @Override public void completed(Integer count, Void attachment1) { - if (count < 1) { + if (count < 1 && readBuffers.isEmpty()) { if (debug) context.getLogger().log(Level.FINEST, "WebSocketRunner abort on read buffer count, force to close channel"); closeRunner(); return; } if (readBuffer == null) return; - readBuffer.flip(); + if (recentExBuffer == null) { + readBuffer.flip(); + } else { + recentExBuffer.flip(); + } + if (!readBuffer.hasRemaining() && (recentExBuffer == null || !recentExBuffer.hasRemaining())) { + final ByteBuffer buffer = context.pollBuffer(); + recentExBuffer = buffer; + readBuffers.add(buffer); + channel.read(buffer, null, this); + return; + } try { ByteBuffer[] exBuffers = null; if (!readBuffers.isEmpty()) { exBuffers = readBuffers.toArray(new ByteBuffer[readBuffers.size()]); readBuffers.clear(); + recentExBuffer = null; } WebSocketPacket packet = coder.decode(readBuffer, exBuffers); if (exBuffers != null) { @@ -383,7 +397,7 @@ public class WebSocketRunner implements Runnable { masker.readMask(); } if (masker.remaining() < length) { - if (debug) logger.log(Level.FINE, " read illegal remaining length from websocket, expect " + length + " but " + buffer.remaining()); + if (debug) logger.log(Level.FINE, " read illegal remaining length from websocket, expect " + length + " but " + masker.remaining()); return null; } final byte[] data = masker.unmask(length);