diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 553b999fd6c..2cf14990b98 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -327,6 +327,9 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { enableButtons(); } else { connectDialog.showDialog(); + if (client.isConnected()) { + showGames(false); + } } } }); @@ -927,13 +930,16 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnConnectActionPerformed if (client.isConnected()) { if (JOptionPane.showConfirmDialog(this, "Are you sure you want to disconnect?", "Confirm disconnect", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { - client.disconnect(); + client.disconnect(false); tablesPane.clearChat(); setWindowTitle(); showMessage("You have disconnected"); } } else { connectDialog.showDialog(); + if (client.isConnected()) { + showGames(false); + } } }//GEN-LAST:event_btnConnectActionPerformed @@ -971,7 +977,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { if (JOptionPane.showConfirmDialog(this, "You are currently connected. Are you sure you want to disconnect?", "Confirm disconnect", JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) { return; } - client.disconnect(); + client.disconnect(false); } else { if (JOptionPane.showConfirmDialog(this, "Are you sure you want to exit?", "Confirm exit", JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) { return; @@ -1282,15 +1288,16 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { } } + @Override public void disconnected(final boolean errorCall) { - if (SwingUtilities.isEventDispatchThread()) { // Returns true if the current thread is an AWT event dispatching thread. - logger.info("DISCONNECTED (Event Dispatch Thread)"); - setStatusText("Not connected"); - disableButtons(); - hideGames(); - hideTables(); - } else { - logger.info("DISCONNECTED (NO Event Dispatch Thread)"); +// if (SwingUtilities.isEventDispatchThread()) { // Returns true if the current thread is an AWT event dispatching thread. +// logger.info("DISCONNECTED (Event Dispatch Thread)"); +// setStatusText("Not connected"); +// disableButtons(); +// hideGames(); +// hideTables(); +// } else { +// logger.info("DISCONNECTED (NO Event Dispatch Thread)"); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { @@ -1302,12 +1309,12 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { if (performConnect()) { enableButtons(); } - } else { - client.disconnect(); +// } else { +// client.disconnect(); } } }); - } +// } } public void showMessage(final String message) { diff --git a/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java b/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java index 55196bb3628..1c738cc50bf 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/ConnectDialog.java @@ -366,7 +366,7 @@ public class ConnectDialog extends MageDialog { if (result) { lblStatus.setText(""); connected(); - MageFrame.getInstance().showGames(false); +// MageFrame.getInstance().showGames(false); } else { lblStatus.setText("Could not connect"); } diff --git a/Mage.Server/src/main/java/mage/server/DisconnectReason.java b/Mage.Common/src/mage/remote/DisconnectReason.java similarity index 85% rename from Mage.Server/src/main/java/mage/server/DisconnectReason.java rename to Mage.Common/src/mage/remote/DisconnectReason.java index 39ab6a87f37..be854c87ac7 100644 --- a/Mage.Server/src/main/java/mage/server/DisconnectReason.java +++ b/Mage.Common/src/mage/remote/DisconnectReason.java @@ -1,4 +1,4 @@ -package mage.server; +package mage.remote; /** * diff --git a/Mage.Network/src/main/java/org/mage/network/Client.java b/Mage.Network/src/main/java/org/mage/network/Client.java index 889dbbac27d..7db7e154922 100644 --- a/Mage.Network/src/main/java/org/mage/network/Client.java +++ b/Mage.Network/src/main/java/org/mage/network/Client.java @@ -30,7 +30,7 @@ import mage.view.TableView; import mage.view.TournamentView; import mage.view.UserView; import org.apache.log4j.Logger; -import org.mage.network.handlers.HeartbeatHandler; +import org.mage.network.handlers.client.HeartbeatHandler; import org.mage.network.handlers.PingMessageHandler; import org.mage.network.handlers.client.ChatMessageHandler; import org.mage.network.handlers.client.ChatRoomHandler; @@ -121,10 +121,11 @@ public class Client { } } - public void disconnect() { + public void disconnect(boolean error) { try { - channel.closeFuture().sync(); + channel.disconnect().sync(); + client.disconnected(error); } catch (InterruptedException ex) { logger.fatal("Error disconnecting", ex); } finally { diff --git a/Mage.Network/src/main/java/org/mage/network/Server.java b/Mage.Network/src/main/java/org/mage/network/Server.java index c667d9077f9..d19b87bacd2 100644 --- a/Mage.Network/src/main/java/org/mage/network/Server.java +++ b/Mage.Network/src/main/java/org/mage/network/Server.java @@ -21,7 +21,7 @@ import io.netty.util.concurrent.GlobalEventExecutor; import java.util.UUID; import mage.view.ChatMessage; import org.apache.log4j.Logger; -import org.mage.network.handlers.HeartbeatHandler; +import org.mage.network.handlers.server.HeartbeatHandler; import org.mage.network.handlers.PingMessageHandler; import org.mage.network.handlers.server.ChatMessageHandler; import org.mage.network.handlers.server.ChatRoomIdHandler; @@ -48,7 +48,7 @@ public class Server { public static final ChannelGroup clients = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE); - private final HeartbeatHandler heartbeatHandler = new HeartbeatHandler(); + private final HeartbeatHandler heartbeatHandler; private final PingMessageHandler pingMessageHandler = new PingMessageHandler(); private final EventExecutorGroup handlersExecutor = new DefaultEventExecutorGroup(Runtime.getRuntime().availableProcessors() * 2); private final RegisterClientMessageHandler registerClientMessageHandler; @@ -60,6 +60,7 @@ public class Server { private final ServerMessageHandler serverMessageHandler; public Server(MageServer server) { + heartbeatHandler = new HeartbeatHandler(server); registerClientMessageHandler = new RegisterClientMessageHandler(server); chatMessageHandler = new ChatMessageHandler(server); joinChatMessageHandler = new JoinChatMessageHandler(server); @@ -98,7 +99,7 @@ public class Server { ch.pipeline().addLast(new ObjectEncoder()); ch.pipeline().addLast("idleStateHandler", new IdleStateHandler(IDLE_TIMEOUT, IDLE_PING_TIME, 0)); - ch.pipeline().addLast("heartbeatHandler", heartbeatHandler); + ch.pipeline().addLast(handlersExecutor, heartbeatHandler); ch.pipeline().addLast("pingMessageHandler", pingMessageHandler); ch.pipeline().addLast("connectionHandler", new ConnectionHandler()); diff --git a/Mage.Network/src/main/java/org/mage/network/handlers/PingMessageHandler.java b/Mage.Network/src/main/java/org/mage/network/handlers/PingMessageHandler.java index c8414cac869..a42ebec1e89 100644 --- a/Mage.Network/src/main/java/org/mage/network/handlers/PingMessageHandler.java +++ b/Mage.Network/src/main/java/org/mage/network/handlers/PingMessageHandler.java @@ -14,7 +14,7 @@ import org.mage.network.model.PongMessage; @Sharable public class PingMessageHandler extends SimpleChannelInboundHandler { - private static final Logger logger = Logger.getLogger(HeartbeatHandler.class); + private static final Logger logger = Logger.getLogger(PingMessageHandler.class); private static PongMessage pong = new PongMessage(); @Override diff --git a/Mage.Network/src/main/java/org/mage/network/handlers/HeartbeatHandler.java b/Mage.Network/src/main/java/org/mage/network/handlers/client/HeartbeatHandler.java similarity index 92% rename from Mage.Network/src/main/java/org/mage/network/handlers/HeartbeatHandler.java rename to Mage.Network/src/main/java/org/mage/network/handlers/client/HeartbeatHandler.java index 7c44738ea75..52929172eeb 100644 --- a/Mage.Network/src/main/java/org/mage/network/handlers/HeartbeatHandler.java +++ b/Mage.Network/src/main/java/org/mage/network/handlers/client/HeartbeatHandler.java @@ -1,4 +1,4 @@ -package org.mage.network.handlers; +package org.mage.network.handlers.client; import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerAdapter; @@ -24,7 +24,7 @@ public class HeartbeatHandler extends ChannelHandlerAdapter { if (evt instanceof IdleStateEvent) { IdleStateEvent e = (IdleStateEvent) evt; if (e.state() == IdleState.READER_IDLE) { - ctx.close(); + ctx.channel().close(); logger.info("Disconnected due to extended idle"); } else if (e.state() == IdleState.WRITER_IDLE) { ctx.writeAndFlush(ping); diff --git a/Mage.Network/src/main/java/org/mage/network/handlers/server/HeartbeatHandler.java b/Mage.Network/src/main/java/org/mage/network/handlers/server/HeartbeatHandler.java new file mode 100644 index 00000000000..bad59ac627d --- /dev/null +++ b/Mage.Network/src/main/java/org/mage/network/handlers/server/HeartbeatHandler.java @@ -0,0 +1,44 @@ +package org.mage.network.handlers.server; + +import io.netty.channel.ChannelHandler.Sharable; +import io.netty.channel.ChannelHandlerAdapter; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.timeout.IdleState; +import io.netty.handler.timeout.IdleStateEvent; +import mage.remote.DisconnectReason; +import org.apache.log4j.Logger; +import org.mage.network.interfaces.MageServer; +import org.mage.network.model.PingMessage; + +/** + * + * @author BetaSteward + */ +@Sharable +public class HeartbeatHandler extends ChannelHandlerAdapter { + + private static final Logger logger = Logger.getLogger(HeartbeatHandler.class); + + private static PingMessage ping = new PingMessage(); + + private final MageServer server; + + public HeartbeatHandler (MageServer server) { + this.server = server; + } + + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + if (evt instanceof IdleStateEvent) { + IdleStateEvent e = (IdleStateEvent) evt; + if (e.state() == IdleState.READER_IDLE) { + server.disconnect(ctx.channel().id().asLongText(), DisconnectReason.LostConnection); + ctx.disconnect(); + logger.info("Disconnected due to extended idle"); + } else if (e.state() == IdleState.WRITER_IDLE) { + ctx.writeAndFlush(ping); + logger.info("Sending ping"); + } + } + } +} diff --git a/Mage.Network/src/main/java/org/mage/network/handlers/server/RegisterClientMessageHandler.java b/Mage.Network/src/main/java/org/mage/network/handlers/server/RegisterClientMessageHandler.java index efbce7ab6a1..19c28f1b20c 100644 --- a/Mage.Network/src/main/java/org/mage/network/handlers/server/RegisterClientMessageHandler.java +++ b/Mage.Network/src/main/java/org/mage/network/handlers/server/RegisterClientMessageHandler.java @@ -3,6 +3,7 @@ package org.mage.network.handlers.server; import io.netty.channel.ChannelHandler.Sharable; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; +import mage.remote.DisconnectReason; import org.mage.network.interfaces.MageServer; import org.mage.network.model.RegisterClientMessage; import org.mage.network.model.ClientRegisteredMessage; @@ -30,6 +31,11 @@ public class RegisterClientMessageHandler extends SimpleChannelInboundHandler