From 31fca5630b66f105c0b07021f2c899df27fd954b Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Thu, 25 May 2017 16:49:01 +0800 Subject: [PATCH] --- src/org/redkale/convert/ConvertFactory.java | 2 + .../convert/ext/ByteBufferSimpledCoder.java | 70 +++++++++++++++++++ src/org/redkale/net/http/WebSocketPacket.java | 12 +++- src/org/redkale/net/http/WebSocketRunner.java | 4 +- 4 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 src/org/redkale/convert/ext/ByteBufferSimpledCoder.java diff --git a/src/org/redkale/convert/ConvertFactory.java b/src/org/redkale/convert/ConvertFactory.java index 4200f86d6..f3a13f7fd 100644 --- a/src/org/redkale/convert/ConvertFactory.java +++ b/src/org/redkale/convert/ConvertFactory.java @@ -9,6 +9,7 @@ import java.io.File; import java.lang.reflect.*; import java.math.BigInteger; import java.net.*; +import java.nio.ByteBuffer; import java.nio.channels.CompletionHandler; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -98,6 +99,7 @@ public abstract class ConvertFactory { this.register(URL.class, URLSimpledCoder.instance); this.register(URI.class, URISimpledCoder.instance); //--------------------------------------------------------- + this.register(ByteBuffer.class, ByteBufferSimpledCoder.instance); this.register(boolean[].class, BoolArraySimpledCoder.instance); this.register(byte[].class, ByteArraySimpledCoder.instance); this.register(short[].class, ShortArraySimpledCoder.instance); diff --git a/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java b/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java new file mode 100644 index 000000000..056a46980 --- /dev/null +++ b/src/org/redkale/convert/ext/ByteBufferSimpledCoder.java @@ -0,0 +1,70 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.convert.ext; + +import java.nio.ByteBuffer; +import org.redkale.convert.Reader; +import org.redkale.convert.SimpledCoder; +import org.redkale.convert.Writer; + +/** + * ByteBuffer 的SimpledCoder实现 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + * @param Reader输入的子类型 + * @param Writer输出的子类型 + */ +public final class ByteBufferSimpledCoder extends SimpledCoder { + + public static final ByteBufferSimpledCoder instance = new ByteBufferSimpledCoder(); + + @Override + public void convertTo(W out, ByteBuffer value) { + if (value == null) { + out.writeNull(); + return; + } + out.writeArrayB(value.remaining()); + boolean flag = false; + for (byte v : value.array()) { + if (flag) out.writeArrayMark(); + out.writeByte(v); + flag = true; + } + out.writeArrayE(); + } + + @Override + public ByteBuffer convertFrom(R in) { + int len = in.readArrayB(); + if (len == Reader.SIGN_NULL) return null; + if (len == Reader.SIGN_NOLENGTH) { + int size = 0; + byte[] data = new byte[8]; + while (in.hasNext()) { + if (size >= data.length) { + byte[] newdata = new byte[data.length + 4]; + System.arraycopy(data, 0, newdata, 0, size); + data = newdata; + } + data[size++] = in.readByte(); + } + in.readArrayE(); + return ByteBuffer.wrap(data, 0, size); + } else { + byte[] values = new byte[len]; + for (int i = 0; i < values.length; i++) { + values[i] = in.readByte(); + } + in.readArrayE(); + return ByteBuffer.wrap(values); + } + } + +} diff --git a/src/org/redkale/net/http/WebSocketPacket.java b/src/org/redkale/net/http/WebSocketPacket.java index 87f6df4b1..bcb0ad56b 100644 --- a/src/org/redkale/net/http/WebSocketPacket.java +++ b/src/org/redkale/net/http/WebSocketPacket.java @@ -62,6 +62,8 @@ public final class WebSocketPacket { JsonConvert sendConvert; + ByteBuffer[] sendBuffers; + ConvertMask receiveMasker; ByteBuffer[] receiveBuffers; @@ -98,6 +100,15 @@ public final class WebSocketPacket { this.last = fin; } + WebSocketPacket(ByteBuffer[] sendBuffers, FrameType type, boolean fin) { + this.type = type; + this.sendBuffers = new ByteBuffer[sendBuffers.length]; + for (int i = 0; i < sendBuffers.length; i++) { + this.sendBuffers[i] = sendBuffers[i].duplicate(); + } + this.last = fin; + } + public WebSocketPacket(byte[] data) { this(FrameType.BINARY, data, true); } @@ -247,7 +258,6 @@ public final class WebSocketPacket { // String rs = JsonConvert.root().convertFrom(String.class, masker, buffer); // System.out.println(rs); // } - /** * 消息解码
* diff --git a/src/org/redkale/net/http/WebSocketRunner.java b/src/org/redkale/net/http/WebSocketRunner.java index 4ac7e5e51..35887b5b9 100644 --- a/src/org/redkale/net/http/WebSocketRunner.java +++ b/src/org/redkale/net/http/WebSocketRunner.java @@ -217,7 +217,7 @@ class WebSocketRunner implements Runnable { queue.add(new QueueEntry(futureResult, packet)); return futureResult; } - ByteBuffer[] buffers = packet.encode(this.context.getBufferSupplier()); + ByteBuffer[] buffers = packet.sendBuffers != null ? packet.sendBuffers : packet.encode(this.context.getBufferSupplier()); this.writeBuffers = buffers; try { channel.write(buffers, buffers, new CompletionHandler() { @@ -264,7 +264,7 @@ class WebSocketRunner implements Runnable { QueueEntry entry = queue.poll(); if (entry != null) { future = entry.future; - ByteBuffer[] buffers = packet.encode(context.getBufferSupplier()); + ByteBuffer[] buffers = packet.sendBuffers != null ? packet.sendBuffers : packet.encode(context.getBufferSupplier()); writeBuffers = buffers; channel.write(buffers, buffers, this); }