From e0041235fee230555b6591178f04d76d065bd558 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Mon, 16 Oct 2017 11:19:58 +0800 Subject: [PATCH] =?UTF-8?q?WebSocket=E5=A2=9E=E5=8A=A0sendMap=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/convert/BinaryConvert.java | 2 + src/org/redkale/convert/TextConvert.java | 1 + src/org/redkale/convert/bson/BsonConvert.java | 1 + src/org/redkale/convert/json/JsonConvert.java | 1 + src/org/redkale/net/http/WebSocket.java | 46 +++++++++++++++++-- src/org/redkale/net/http/WebSocketEngine.java | 4 +- src/org/redkale/net/http/WebSocketPacket.java | 8 +++- 7 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/org/redkale/convert/BinaryConvert.java b/src/org/redkale/convert/BinaryConvert.java index 0cb388068..5019545a2 100644 --- a/src/org/redkale/convert/BinaryConvert.java +++ b/src/org/redkale/convert/BinaryConvert.java @@ -31,4 +31,6 @@ public abstract class BinaryConvert extends public abstract byte[] convertTo(final Object value); public abstract byte[] convertTo(final Type type, final Object value); + + public abstract byte[] convertMapTo(final Object... values); } diff --git a/src/org/redkale/convert/TextConvert.java b/src/org/redkale/convert/TextConvert.java index c6f3b095a..7d9d0b086 100644 --- a/src/org/redkale/convert/TextConvert.java +++ b/src/org/redkale/convert/TextConvert.java @@ -32,4 +32,5 @@ public abstract class TextConvert extends Co public abstract String convertTo(final Type type, final Object value); + public abstract String convertMapTo(final Object... values); } diff --git a/src/org/redkale/convert/bson/BsonConvert.java b/src/org/redkale/convert/bson/BsonConvert.java index 002b09637..ceb02abfb 100644 --- a/src/org/redkale/convert/bson/BsonConvert.java +++ b/src/org/redkale/convert/bson/BsonConvert.java @@ -161,6 +161,7 @@ public final class BsonConvert extends BinaryConvert { return result; } + @Override public byte[] convertMapTo(final Object... values) { if (values == null) return null; final BsonWriter out = writerPool.get().tiny(tiny); diff --git a/src/org/redkale/convert/json/JsonConvert.java b/src/org/redkale/convert/json/JsonConvert.java index 307f91334..1498adff1 100644 --- a/src/org/redkale/convert/json/JsonConvert.java +++ b/src/org/redkale/convert/json/JsonConvert.java @@ -146,6 +146,7 @@ public final class JsonConvert extends TextConvert { return result; } + @Override public String convertMapTo(final Object... values) { if (values == null) return "null"; final JsonWriter out = writerPool.get().tiny(tiny); diff --git a/src/org/redkale/net/http/WebSocket.java b/src/org/redkale/net/http/WebSocket.java index 847a4e3cd..bb31c06d7 100644 --- a/src/org/redkale/net/http/WebSocket.java +++ b/src/org/redkale/net/http/WebSocket.java @@ -118,7 +118,18 @@ public abstract class WebSocket { * @return 0表示成功, 非0表示错误码 */ public final CompletableFuture send(Object message) { - return send(message, true); + return send(false, message, true); + } + + /** + * 给自身发送消息, 消息类型是key-value键值对 + * + * @param messages key-value键值对 + * + * @return 0表示成功, 非0表示错误码 + */ + public final CompletableFuture sendMap(Object... messages) { + return send(true, messages, true); } /** @@ -130,6 +141,31 @@ public abstract class WebSocket { * @return 0表示成功, 非0表示错误码 */ public final CompletableFuture send(Object message, boolean last) { + return send(false, message, last); + } + + /** + * 给自身发送消息, 消息类型是key-value键值对 + * + * @param last 是否最后一条 + * @param messages key-value键值对 + * + * @return 0表示成功, 非0表示错误码 + */ + public final CompletableFuture sendMap(boolean last, Object... messages) { + return send(true, messages, last); + } + + /** + * 给自身发送消息, 消息类型是Object[] + * + * @param mapconvable 是否convertMapTo + * @param message 不可为空, 只能是String或byte[]或可JavaBean对象,或Object[] + * @param last 是否最后一条 + * + * @return 0表示成功, 非0表示错误码 + */ + private CompletableFuture send(boolean mapconvable, Object message, boolean last) { if (message instanceof CompletableFuture) { return ((CompletableFuture) message).thenCompose((json) -> { if (json == null || json instanceof CharSequence || json instanceof byte[]) { @@ -137,7 +173,7 @@ public abstract class WebSocket { } else if (message instanceof WebSocketPacket) { return sendPacket((WebSocketPacket) message); } else { - return sendPacket(new WebSocketPacket(getSendConvert(), json, last)); + return sendPacket(new WebSocketPacket(getSendConvert(), mapconvable, json, last)); } }); } @@ -146,7 +182,7 @@ public abstract class WebSocket { } else if (message instanceof WebSocketPacket) { return sendPacket((WebSocketPacket) message); } else { - return sendPacket(new WebSocketPacket(getSendConvert(), message, last)); + return sendPacket(new WebSocketPacket(getSendConvert(), mapconvable, message, last)); } } @@ -173,9 +209,9 @@ public abstract class WebSocket { */ public final CompletableFuture send(Convert convert, Object message, boolean last) { if (message instanceof CompletableFuture) { - return ((CompletableFuture) message).thenCompose((json) -> sendPacket(new WebSocketPacket(convert == null ? getSendConvert() : convert, json, last))); + return ((CompletableFuture) message).thenCompose((json) -> sendPacket(new WebSocketPacket(convert == null ? getSendConvert() : convert, false, json, last))); } - return sendPacket(new WebSocketPacket(convert == null ? getSendConvert() : convert, message, last)); + return sendPacket(new WebSocketPacket(convert == null ? getSendConvert() : convert, false, message, last)); } /** diff --git a/src/org/redkale/net/http/WebSocketEngine.java b/src/org/redkale/net/http/WebSocketEngine.java index 322b8a512..83ea0915c 100644 --- a/src/org/redkale/net/http/WebSocketEngine.java +++ b/src/org/redkale/net/http/WebSocketEngine.java @@ -147,7 +147,7 @@ public class WebSocketEngine { //此处的WebSocketPacket只能是包含payload或bytes内容的,不能包含sendConvert、sendJson、sendBuffers final WebSocketPacket packet = (message instanceof WebSocketPacket) ? (WebSocketPacket) message : ((message == null || message instanceof CharSequence || message instanceof byte[]) - ? new WebSocketPacket((Serializable) message, last) : new WebSocketPacket(this.sendConvert, message, last)); + ? new WebSocketPacket((Serializable) message, last) : new WebSocketPacket(this.sendConvert, false, message, last)); packet.setSendBuffers(packet.encode(context.getBufferSupplier())); CompletableFuture future = null; if (single) { @@ -194,7 +194,7 @@ public class WebSocketEngine { //此处的WebSocketPacket只能是包含payload或bytes内容的,不能包含sendConvert、sendJson、sendBuffers final WebSocketPacket packet = (message instanceof WebSocketPacket) ? (WebSocketPacket) message : ((message == null || message instanceof CharSequence || message instanceof byte[]) - ? new WebSocketPacket((Serializable) message, last) : new WebSocketPacket(this.sendConvert, message, last)); + ? new WebSocketPacket((Serializable) message, last) : new WebSocketPacket(this.sendConvert, false, message, last)); packet.setSendBuffers(packet.encode(context.getBufferSupplier())); CompletableFuture future = null; if (single) { diff --git a/src/org/redkale/net/http/WebSocketPacket.java b/src/org/redkale/net/http/WebSocketPacket.java index 2d2552faf..5a38b227d 100644 --- a/src/org/redkale/net/http/WebSocketPacket.java +++ b/src/org/redkale/net/http/WebSocketPacket.java @@ -61,6 +61,8 @@ public final class WebSocketPacket { Convert sendConvert; + boolean mapconvable; + ByteBuffer[] sendBuffers; ConvertMask receiveMasker; @@ -114,11 +116,13 @@ public final class WebSocketPacket { this.last = fin; } - WebSocketPacket(Convert convert, Object json, boolean fin) { + WebSocketPacket(Convert convert, boolean mapconvable, Object json, boolean fin) { this.type = (convert == null || !convert.isBinary()) ? FrameType.TEXT : FrameType.BINARY; this.sendConvert = convert; + this.mapconvable = mapconvable; this.sendJson = json; this.last = fin; + if (mapconvable && !(json instanceof Object[])) throw new IllegalArgumentException(); } WebSocketPacket(ByteBuffer[] sendBuffers, FrameType type, boolean fin) { @@ -207,7 +211,7 @@ public final class WebSocketPacket { return supplier.get(); } }; - ByteBuffer[] buffers = this.sendConvert.convertTo(newsupplier, sendJson); + ByteBuffer[] buffers = this.mapconvable ? this.sendConvert.convertMapTo(supplier, (Object[]) sendJson) : this.sendConvert.convertTo(newsupplier, sendJson); int len = 0; for (ByteBuffer buf : buffers) { len += buf.remaining();