This commit is contained in:
地平线
2015-06-29 12:39:52 +08:00
parent 80447efa4a
commit b6b85d57b4

View File

@@ -151,27 +151,39 @@ public class WebSocketRunner implements Runnable {
} }
final boolean debug = this.coder.debugable; final boolean debug = this.coder.debugable;
if (writeBuffer == null) return; if (writeBuffer == null) return;
writeBuffer.clear(); ByteBuffer sendBuffer = null;
writeBuffer.put(bytes); if (bytes.length <= writeBuffer.capacity()) {
writeBuffer.flip(); writeBuffer.clear();
writeBuffer.put(bytes);
writeBuffer.flip();
sendBuffer = writeBuffer;
} else {
sendBuffer = ByteBuffer.wrap(bytes);
}
try { try {
channel.write(writeBuffer, null, new CompletionHandler<Integer, Void>() { channel.write(sendBuffer, sendBuffer, new CompletionHandler<Integer, ByteBuffer>() {
@Override @Override
public void completed(Integer result, Void attachment) { public void completed(Integer result, ByteBuffer attachment) {
if (writeBuffer == null || closed) return; if (attachment == null || closed) return;
try { try {
if (writeBuffer.hasRemaining()) { if (attachment.hasRemaining()) {
if (debug) context.getLogger().log(Level.FINEST, "WebSocketRunner write completed reemaining: " + writeBuffer.remaining()); if (debug) context.getLogger().log(Level.FINEST, "WebSocketRunner write completed reemaining: " + attachment.remaining());
channel.write(writeBuffer, attachment, this); channel.write(attachment, attachment, this);
return; return;
} }
byte[] bs = queue.poll(); byte[] bs = queue.poll();
if (bs != null && writeBuffer != null) { if (bs != null && writeBuffer != null) {
writeBuffer.clear(); ByteBuffer sendBuffer;
writeBuffer.put(bytes); if (bs.length <= writeBuffer.capacity()) {
writeBuffer.flip(); writeBuffer.clear();
channel.write(writeBuffer, null, this); writeBuffer.put(bs);
writeBuffer.flip();
sendBuffer = writeBuffer;
} else {
sendBuffer = ByteBuffer.wrap(bs);
}
channel.write(sendBuffer, sendBuffer, this);
return; return;
} }
} catch (NullPointerException e) { } catch (NullPointerException e) {
@@ -183,7 +195,7 @@ public class WebSocketRunner implements Runnable {
} }
@Override @Override
public void failed(Throwable exc, Void attachment) { public void failed(Throwable exc, ByteBuffer attachment) {
writing.set(false); writing.set(false);
closeRunner(); closeRunner();
if (exc != null) { if (exc != null) {