From 500fc7becc8384d26a6d126c553adc499a097894 Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 31 Aug 2012 12:20:26 +0400 Subject: [PATCH] onDisconnect issue fixed --- .../corundumstudio/socketio/PacketListener.java | 3 +-- .../socketio/namespace/Namespace.java | 1 - .../socketio/transport/BaseClient.java | 16 +++++++++++++++- .../socketio/transport/NamespaceClient.java | 4 +++- .../socketio/transport/WebSocketTransport.java | 8 ++++---- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/corundumstudio/socketio/PacketListener.java b/src/main/java/com/corundumstudio/socketio/PacketListener.java index ce7ef50..84aaf56 100644 --- a/src/main/java/com/corundumstudio/socketio/PacketListener.java +++ b/src/main/java/com/corundumstudio/socketio/PacketListener.java @@ -72,8 +72,7 @@ public class PacketListener { } case DISCONNECT: - Namespace namespace = namespacesHub.get(packet.getEndpoint()); - namespace.onDisconnect(client); + ((NamespaceClient)client).onDisconnect(); break; } } diff --git a/src/main/java/com/corundumstudio/socketio/namespace/Namespace.java b/src/main/java/com/corundumstudio/socketio/namespace/Namespace.java index 3bf04f9..44c4512 100644 --- a/src/main/java/com/corundumstudio/socketio/namespace/Namespace.java +++ b/src/main/java/com/corundumstudio/socketio/namespace/Namespace.java @@ -123,7 +123,6 @@ public class Namespace implements SocketIONamespace { listener.onDisconnect(client); } clients.remove(client); - ((NamespaceClient)client).onDisconnect(); } @Override diff --git a/src/main/java/com/corundumstudio/socketio/transport/BaseClient.java b/src/main/java/com/corundumstudio/socketio/transport/BaseClient.java index 81a4f33..2cadff3 100644 --- a/src/main/java/com/corundumstudio/socketio/transport/BaseClient.java +++ b/src/main/java/com/corundumstudio/socketio/transport/BaseClient.java @@ -32,6 +32,14 @@ import com.corundumstudio.socketio.namespace.Namespace; import com.corundumstudio.socketio.parser.Packet; import com.corundumstudio.socketio.parser.PacketType; +/** + * Base class for main client. + * + * Each main client can have multiple namespace clients, + * when all namespace clients has disconnected then main client disconnects too. + * + * + */ public abstract class BaseClient { private final ConcurrentMap namespaceClients = new ConcurrentHashMap(); @@ -72,6 +80,12 @@ public abstract class BaseClient { return namespaceClients.values(); } + public void onChannelDisconnect() { + for (SocketIOClient client : getAllClients()) { + ((NamespaceClient) client).onDisconnect(); + } + } + public AckManager getAckManager() { return ackManager; } @@ -88,7 +102,7 @@ public abstract class BaseClient { ChannelFuture future = send(new Packet(PacketType.DISCONNECT)); future.addListener(ChannelFutureListener.CLOSE); - disconnectable.onDisconnect(this); + onChannelDisconnect(); } } diff --git a/src/main/java/com/corundumstudio/socketio/transport/NamespaceClient.java b/src/main/java/com/corundumstudio/socketio/transport/NamespaceClient.java index 1eaf29a..76ada22 100644 --- a/src/main/java/com/corundumstudio/socketio/transport/NamespaceClient.java +++ b/src/main/java/com/corundumstudio/socketio/transport/NamespaceClient.java @@ -102,13 +102,15 @@ public class NamespaceClient implements SocketIOClient { } public void onDisconnect() { + namespace.onDisconnect(this); baseClient.removeClient(this); } @Override public void disconnect() { send(new Packet(PacketType.DISCONNECT)); - namespace.onDisconnect(this); + // TODO disconnect on channel close + onDisconnect(); } @Override diff --git a/src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java b/src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java index 001460b..7b54a3c 100644 --- a/src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java +++ b/src/main/java/com/corundumstudio/socketio/transport/WebSocketTransport.java @@ -61,7 +61,7 @@ public class WebSocketTransport extends SimpleChannelUpstreamHandler implements private final AckManager ackManager; private final HeartbeatHandler heartbeatHandler; private final AuthorizeHandler authorizeHandler; - private final DisconnectableHub disconnectable; + private final DisconnectableHub disconnectableHub; private final String path; @@ -70,7 +70,7 @@ public class WebSocketTransport extends SimpleChannelUpstreamHandler implements this.path = connectPath + "websocket"; this.authorizeHandler = authorizeHandler; this.ackManager = ackManager; - this.disconnectable = disconnectable; + this.disconnectableHub = disconnectable; this.heartbeatHandler = heartbeatHandler; } @@ -95,7 +95,7 @@ public class WebSocketTransport extends SimpleChannelUpstreamHandler implements throws Exception { WebSocketClient client = channelId2Client.get(ctx.getChannel().getId()); if (client != null) { - disconnectable.onDisconnect(client); + client.onChannelDisconnect(); } else { super.channelDisconnected(ctx, e); } @@ -143,7 +143,7 @@ public class WebSocketTransport extends SimpleChannelUpstreamHandler implements return; } - WebSocketClient client = new WebSocketClient(channel, ackManager, disconnectable, sessionId); + WebSocketClient client = new WebSocketClient(channel, ackManager, disconnectableHub, sessionId); channelId2Client.put(channel.getId(), client); sessionId2Client.put(sessionId, client);