From f6b407aa4437dc25bada7711344f4645d387ef4f Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Wed, 18 Oct 2017 10:47:43 +0800 Subject: [PATCH] =?UTF-8?q?WebSocket=E8=AF=86=E5=88=ABSingle=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=EF=BC=8CSingle=E6=A8=A1=E5=BC=8F=E4=B8=8B=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E7=99=BB=E9=99=86=E6=97=B6=E9=BB=98=E8=AE=A4=E4=BC=9A?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E4=B9=8B=E5=89=8D=E7=9A=84WebSocket=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/net/http/WebSocket.java | 8 +++++++ .../redkale/net/http/WebSocketServlet.java | 21 ++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/org/redkale/net/http/WebSocket.java b/src/org/redkale/net/http/WebSocket.java index d4592f61d..78ece1cf1 100644 --- a/src/org/redkale/net/http/WebSocket.java +++ b/src/org/redkale/net/http/WebSocket.java @@ -596,6 +596,14 @@ public abstract class WebSocket { this.getLogger().log(Level.SEVERE, "WebSocket receive or send Message error", t); } + /** + * 当Single模式下用户重复登陆时回调函数, 默认处理逻辑:关闭之前的WebSocket连接 + * + */ + public void onSingleRepeatConnect() { + this._engine.node.forceCloseWebSocket(getUserid()); + } + /** * 获取Logger * diff --git a/src/org/redkale/net/http/WebSocketServlet.java b/src/org/redkale/net/http/WebSocketServlet.java index 20cfeb767..91475eaca 100644 --- a/src/org/redkale/net/http/WebSocketServlet.java +++ b/src/org/redkale/net/http/WebSocketServlet.java @@ -186,11 +186,22 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl return; } webSocket._userid = userid; - WebSocketServlet.this.node.localEngine.add(webSocket); - WebSocketRunner runner = new WebSocketRunner(context, webSocket, restMessageConsumer, response.removeChannel()); - webSocket._runner = runner; - context.runAsync(runner); - response.finish(true); + if (single) { + WebSocketServlet.this.node.existsWebSocket(userid).whenComplete((rs, ex) -> { + if (rs) webSocket.onSingleRepeatConnect(); + WebSocketServlet.this.node.localEngine.add(webSocket); + WebSocketRunner runner = new WebSocketRunner(context, webSocket, restMessageConsumer, response.removeChannel()); + webSocket._runner = runner; + context.runAsync(runner); + response.finish(true); + }); + } else { + WebSocketServlet.this.node.localEngine.add(webSocket); + WebSocketRunner runner = new WebSocketRunner(context, webSocket, restMessageConsumer, response.removeChannel()); + webSocket._runner = runner; + context.runAsync(runner); + response.finish(true); + } }); }