From 44bce13f4cce0c2ad89af94635913bbe3c7df203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=9C=B0=E5=B9=B3=E7=BA=BF?= <22250530@qq.com> Date: Tue, 30 Jun 2015 15:27:28 +0800 Subject: [PATCH] --- .../wentch/redkale/net/http/WebSocket.java | 42 +++++++++++++---- .../redkale/service/WebSocketNodeService.java | 45 +++++++++++++++---- 2 files changed, 69 insertions(+), 18 deletions(-) diff --git a/src/com/wentch/redkale/net/http/WebSocket.java b/src/com/wentch/redkale/net/http/WebSocket.java index c6e1499aa..8cbbc8631 100644 --- a/src/com/wentch/redkale/net/http/WebSocket.java +++ b/src/com/wentch/redkale/net/http/WebSocket.java @@ -68,20 +68,44 @@ public abstract class WebSocket { } public final int sendMessage(Serializable groupid, String text, boolean last) { - if (nodeService == null) return WebSocketNodeService.RETCODE_NODESERVICE_NULL; - if (groupid == this.groupid) { - return nodeService.onSend(this.engine.getEngineid(), groupid, text, last); - } else { - return nodeService.send(this.engine.getEngineid(), groupid, text, last); - } + return sendMessage(groupid, false, text, last); } public final int sendMessage(Serializable groupid, byte[] data, boolean last) { + return sendMessage(groupid, false, data, last); + } + + public final int sendRecentMessage(Serializable groupid, String text) { + return sendRecentMessage(groupid, text, true); + } + + public final int sendRecentMessage(Serializable groupid, byte[] data) { + return sendRecentMessage(groupid, data, true); + } + + public final int sendRecentMessage(Serializable groupid, String text, boolean last) { + return sendMessage(groupid, true, text, last); + } + + public final int sendRecentMessage(Serializable groupid, byte[] data, boolean last) { + return sendMessage(groupid, true, data, last); + } + + private int sendMessage(Serializable groupid, boolean recent, String text, boolean last) { if (nodeService == null) return WebSocketNodeService.RETCODE_NODESERVICE_NULL; if (groupid == this.groupid) { - return nodeService.onSend(this.engine.getEngineid(), groupid, data, last); + return nodeService.onSend(this.engine.getEngineid(), groupid, recent, text, last); } else { - return nodeService.send(this.engine.getEngineid(), groupid, data, last); + return nodeService.send(this.engine.getEngineid(), groupid, recent, text, last); + } + } + + private int sendMessage(Serializable groupid, boolean recent, byte[] data, boolean last) { + if (nodeService == null) return WebSocketNodeService.RETCODE_NODESERVICE_NULL; + if (groupid == this.groupid) { + return nodeService.onSend(this.engine.getEngineid(), groupid, recent, data, last); + } else { + return nodeService.send(this.engine.getEngineid(), groupid, recent, data, last); } } @@ -114,7 +138,7 @@ public abstract class WebSocket { protected final WebSocketGroup getWebSocketGroup(long groupid) { return engine.getWebSocketGroup(groupid); } - + protected final Collection getWebSocketGroups() { return engine.getWebSocketGroups(); } diff --git a/src/com/wentch/redkale/service/WebSocketNodeService.java b/src/com/wentch/redkale/service/WebSocketNodeService.java index 883b45370..65d63445a 100644 --- a/src/com/wentch/redkale/service/WebSocketNodeService.java +++ b/src/com/wentch/redkale/service/WebSocketNodeService.java @@ -146,11 +146,20 @@ public class WebSocketNodeService implements Service { @RemoteOn public int send(String engineid, Serializable groupid, String text, boolean last) { - return send0(engineid, groupid, text, last); + return send0(engineid, groupid, false, text, last); } public final int onSend(String engineid, Serializable groupid, String text, boolean last) { - return onSend0(engineid, groupid, text, last); + return onSend0(engineid, groupid, false, text, last); + } + + @RemoteOn + public int send(String engineid, Serializable groupid, boolean recent, String text, boolean last) { + return send0(engineid, groupid, recent, text, last); + } + + public final int onSend(String engineid, Serializable groupid, boolean recent, String text, boolean last) { + return onSend0(engineid, groupid, recent, text, last); } @RemoteOn @@ -164,18 +173,27 @@ public class WebSocketNodeService implements Service { @RemoteOn public int send(String engineid, Serializable groupid, byte[] data, boolean last) { - return send0(engineid, groupid, data, last); + return send0(engineid, groupid, false, data, last); } public final int onSend(String engineid, Serializable groupid, byte[] data, boolean last) { - return onSend0(engineid, groupid, data, last); + return onSend0(engineid, groupid, false, data, last); } - private int send0(String engineid, Serializable groupid, Serializable text, boolean last) { + @RemoteOn + public int send(String engineid, Serializable groupid, boolean recent, byte[] data, boolean last) { + return send0(engineid, groupid, recent, data, last); + } + + public final int onSend(String engineid, Serializable groupid, boolean recent, byte[] data, boolean last) { + return onSend0(engineid, groupid, recent, data, last); + } + + private int send0(String engineid, Serializable groupid, boolean recent, Serializable text, boolean last) { final Set nodes = usernodes.get(groupid); if (nodes == null) return RETCODE_WSOFFLINE; //未登录 int rs = 0; - if (nodes.contains(this.localNodeName)) rs = onSend0(engineid, groupid, text, last); + if (nodes.contains(this.localNodeName)) rs = onSend0(engineid, groupid, recent, text, last); if (nodemaps == null) return rs; this.nodemaps.forEach((x, y) -> { if (nodes.contains(x)) { @@ -201,10 +219,11 @@ public class WebSocketNodeService implements Service { * * @param engineid * @param groupid 接收方 + * @param recent 是否只发送最近的WebSocket端 * @param text * @return */ - private int onSend0(String engineid, Serializable groupid, Serializable text, boolean last) { + private int onSend0(String engineid, Serializable groupid, boolean recent, Serializable text, boolean last) { WebSocketEngine webSocketEngine = engines.get(engineid); if (webSocketEngine == null) { if (finest) logger.finest("Node(" + localNodeName + ") receive websocket message {engineid:'" + engineid + "', groupid:" + groupid + ", content:'" + text + "'} but result is " + RETCODE_ENGINE_NULL); @@ -217,9 +236,17 @@ public class WebSocketNodeService implements Service { } if (finest) logger.finest("Node (" + localNodeName + ") receive websocket message {engineid:'" + engineid + "', groupid:" + groupid + ", content:'" + text + "'}."); if (text != null && text.getClass() == byte[].class) { - group.getWebSockets().forEach(x -> x.send((byte[]) text, last)); + if (recent) { + group.getRecentWebSocket().send((byte[]) text, last); + } else { + group.getWebSockets().forEach(x -> x.send((byte[]) text, last)); + } } else { - group.getWebSockets().forEach(x -> x.send(text.toString(), last)); + if (recent) { + group.getRecentWebSocket().send(text.toString(), last); + } else { + group.getWebSockets().forEach(x -> x.send(text.toString(), last)); + } } return 0; }