From b6b85d57b4fc8756c4ad7632fdde2c525a748112 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 12:39:52 +0800 Subject: [PATCH] --- .../redkale/net/http/WebSocketRunner.java | 40 ++++++++++++------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/src/com/wentch/redkale/net/http/WebSocketRunner.java b/src/com/wentch/redkale/net/http/WebSocketRunner.java index 871e8a6f3..e473bc68d 100644 --- a/src/com/wentch/redkale/net/http/WebSocketRunner.java +++ b/src/com/wentch/redkale/net/http/WebSocketRunner.java @@ -151,27 +151,39 @@ public class WebSocketRunner implements Runnable { } final boolean debug = this.coder.debugable; if (writeBuffer == null) return; - writeBuffer.clear(); - writeBuffer.put(bytes); - writeBuffer.flip(); + ByteBuffer sendBuffer = null; + if (bytes.length <= writeBuffer.capacity()) { + writeBuffer.clear(); + writeBuffer.put(bytes); + writeBuffer.flip(); + sendBuffer = writeBuffer; + } else { + sendBuffer = ByteBuffer.wrap(bytes); + } try { - channel.write(writeBuffer, null, new CompletionHandler() { + channel.write(sendBuffer, sendBuffer, new CompletionHandler() { @Override - public void completed(Integer result, Void attachment) { - if (writeBuffer == null || closed) return; + public void completed(Integer result, ByteBuffer attachment) { + if (attachment == null || closed) return; try { - if (writeBuffer.hasRemaining()) { - if (debug) context.getLogger().log(Level.FINEST, "WebSocketRunner write completed reemaining: " + writeBuffer.remaining()); - channel.write(writeBuffer, attachment, this); + if (attachment.hasRemaining()) { + if (debug) context.getLogger().log(Level.FINEST, "WebSocketRunner write completed reemaining: " + attachment.remaining()); + channel.write(attachment, attachment, this); return; } byte[] bs = queue.poll(); if (bs != null && writeBuffer != null) { - writeBuffer.clear(); - writeBuffer.put(bytes); - writeBuffer.flip(); - channel.write(writeBuffer, null, this); + ByteBuffer sendBuffer; + if (bs.length <= writeBuffer.capacity()) { + writeBuffer.clear(); + writeBuffer.put(bs); + writeBuffer.flip(); + sendBuffer = writeBuffer; + } else { + sendBuffer = ByteBuffer.wrap(bs); + } + channel.write(sendBuffer, sendBuffer, this); return; } } catch (NullPointerException e) { @@ -183,7 +195,7 @@ public class WebSocketRunner implements Runnable { } @Override - public void failed(Throwable exc, Void attachment) { + public void failed(Throwable exc, ByteBuffer attachment) { writing.set(false); closeRunner(); if (exc != null) {