From 05925b4f78b4f5c4b19ffeace2a8a8152183cc0e Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Sun, 21 May 2017 21:21:56 +0800 Subject: [PATCH] --- src/org/redkale/net/http/WebSocket.java | 13 +++++------ src/org/redkale/net/http/WebSocketGroup.java | 4 ++-- src/org/redkale/net/http/WebSocketRunner.java | 2 +- .../redkale/net/http/WebSocketServlet.java | 23 +++++++++++++++++++ .../test/websocket/ChatWebSocketServlet.java | 14 ++++------- 5 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/org/redkale/net/http/WebSocket.java b/src/org/redkale/net/http/WebSocket.java index b36c72ea6..787d1e693 100644 --- a/src/org/redkale/net/http/WebSocket.java +++ b/src/org/redkale/net/http/WebSocket.java @@ -36,8 +36,9 @@ import org.redkale.util.Comment; * 详情见: https://redkale.org * * @author zhangjx + * @param 泛型 */ -public abstract class WebSocket { +public abstract class WebSocket { @Comment("消息不合法") public static final int RETCODE_SEND_ILLPACKET = 1 << 1; //2 @@ -79,6 +80,8 @@ public abstract class WebSocket { JsonConvert _jsonConvert; //不可能为空 + java.lang.reflect.Type _messageTextType; //不可能为空 + private final long createtime = System.currentTimeMillis(); private Map attributes = new HashMap<>(); //非线程安全 @@ -528,17 +531,13 @@ public abstract class WebSocket { public void onPong(byte[] bytes) { } - public java.lang.reflect.Type getTextMessageType() { - return String.class; - } - - public void onMessage(Object message) { + public void onMessage(T message) { } public void onMessage(byte[] bytes) { } - public void onFragment(Object message, boolean last) { + public void onFragment(T message, boolean last) { } public void onFragment(byte[] bytes, boolean last) { diff --git a/src/org/redkale/net/http/WebSocketGroup.java b/src/org/redkale/net/http/WebSocketGroup.java index 23889dc51..554244c51 100644 --- a/src/org/redkale/net/http/WebSocketGroup.java +++ b/src/org/redkale/net/http/WebSocketGroup.java @@ -99,9 +99,9 @@ public final class WebSocketGroup { CompletableFuture future = null; for (WebSocket s : list) { if (future == null) { - future = s.send(packet); + future = s.sendPacket(packet); } else { - future.thenCombine(s.send(packet), (a, b) -> a | b); + future.thenCombine(s.sendPacket(packet), (a, b) -> a | (Integer) b); } } return future == null ? CompletableFuture.completedFuture(0) : future; diff --git a/src/org/redkale/net/http/WebSocketRunner.java b/src/org/redkale/net/http/WebSocketRunner.java index e6e02f248..ed40c7c5c 100644 --- a/src/org/redkale/net/http/WebSocketRunner.java +++ b/src/org/redkale/net/http/WebSocketRunner.java @@ -117,7 +117,7 @@ public class WebSocketRunner implements Runnable { webSocket._group.setRecentWebSocket(webSocket); try { if (packet.type == FrameType.TEXT) { - Object message = convert.convertFrom(webSocket.getTextMessageType(), packet.receiveMasker, packet.receiveBuffers); + Object message = convert.convertFrom(webSocket._messageTextType, packet.receiveMasker, packet.receiveBuffers); if (readBuffer != null) { readBuffer.clear(); channel.read(readBuffer, null, this); diff --git a/src/org/redkale/net/http/WebSocketServlet.java b/src/org/redkale/net/http/WebSocketServlet.java index 0cb721248..48f7a0c19 100644 --- a/src/org/redkale/net/http/WebSocketServlet.java +++ b/src/org/redkale/net/http/WebSocketServlet.java @@ -6,6 +6,7 @@ package org.redkale.net.http; import java.io.*; +import java.lang.reflect.*; import java.net.*; import java.nio.*; import java.security.*; @@ -61,6 +62,27 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl @Resource(name = "$") protected WebSocketNode node; + protected final Type messageTextType; + + protected WebSocketServlet() { + Type msgtype = String.class; + try { + for (Method method : this.getClass().getDeclaredMethods()) { + if (!method.getName().equals("createWebSocket")) continue; + if (method.getParameterCount() > 0) continue; + Type rt = method.getGenericReturnType(); + if (rt instanceof ParameterizedType) { + msgtype = ((ParameterizedType) rt).getActualTypeArguments()[0]; + } + if (msgtype == Object.class) msgtype = String.class; + break; + } + } catch (Exception e) { + logger.warning(this.getClass().getName() + " not designate text message type on createWebSocket Method"); + } + this.messageTextType = msgtype; + } + @Override final void preInit(HttpContext context, AnyValue conf) { InetSocketAddress addr = context.getServerAddress(); @@ -103,6 +125,7 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl } final WebSocket webSocket = this.createWebSocket(); webSocket._engine = this.node.localEngine; + webSocket._messageTextType = this.messageTextType; webSocket._jsonConvert = jsonConvert; webSocket._remoteAddress = request.getRemoteAddress(); webSocket._remoteAddr = request.getRemoteAddr(); diff --git a/test/org/redkale/test/websocket/ChatWebSocketServlet.java b/test/org/redkale/test/websocket/ChatWebSocketServlet.java index e44d86876..d53588f74 100644 --- a/test/org/redkale/test/websocket/ChatWebSocketServlet.java +++ b/test/org/redkale/test/websocket/ChatWebSocketServlet.java @@ -9,7 +9,6 @@ import org.redkale.net.http.WebServlet; import org.redkale.net.http.WebSocketServlet; import org.redkale.net.http.WebSocket; import java.io.*; -import java.lang.reflect.Type; import java.util.concurrent.atomic.*; import org.redkale.convert.json.JsonConvert; import org.redkale.util.Utility; @@ -51,15 +50,14 @@ public class ChatWebSocketServlet extends WebSocketServlet { } @Override - protected WebSocket createWebSocket() { + protected WebSocket createWebSocket() { - return new WebSocket() { + return new WebSocket() { @Override - public void onMessage(Object text) { + public void onMessage(ChatMessage message) { icounter.incrementAndGet(); counter.incrementAndGet(); - ChatMessage message = (ChatMessage) text;//jsonConvert.convertFrom(ChatMessage.class, text.toString()); if (debug) System.out.println("收到消息: " + message); super.getWebSocketGroup().getWebSockets().forEach(x -> x.send(message)); } @@ -68,11 +66,7 @@ public class ChatWebSocketServlet extends WebSocketServlet { protected Serializable createGroupid() { return ""; } - - @Override - public Type getTextMessageType(){ - return ChatMessage.class; - } + }; }