added disconnect handling

This commit is contained in:
betasteward 2015-05-26 22:13:39 -04:00
parent b68cd765b7
commit 2143e87543
18 changed files with 99 additions and 24 deletions

View file

@ -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) {

View file

@ -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");
}

View file

@ -1,4 +1,4 @@
package mage.server;
package mage.remote;
/**
*

View file

@ -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 {

View file

@ -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());

View file

@ -14,7 +14,7 @@ import org.mage.network.model.PongMessage;
@Sharable
public class PingMessageHandler extends SimpleChannelInboundHandler<PingMessage> {
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

View file

@ -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);

View file

@ -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");
}
}
}
}

View file

@ -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<Re
}
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
server.disconnect(ctx.channel().id().asLongText(), DisconnectReason.Disconnected);
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
ctx.flush();

View file

@ -12,6 +12,7 @@ import org.mage.network.model.MessageType;
public interface MageClient {
void connected(String message);
void disconnected(boolean error);
void inform(String message, MessageType type);

View file

@ -3,6 +3,7 @@ package org.mage.network.interfaces;
import java.util.List;
import java.util.UUID;
import mage.interfaces.ServerState;
import mage.remote.DisconnectReason;
import mage.utils.MageVersion;
/**
@ -12,6 +13,7 @@ import mage.utils.MageVersion;
public interface MageServer {
boolean registerClient(String userName, String sessionId, MageVersion version);
void disconnect(String sessionId, DisconnectReason reason);
void receiveChatMessage(UUID chatId, String sessionId, String message);
void joinChat(UUID chatId, String sessionId);

View file

@ -28,6 +28,7 @@
package mage.server;
import mage.remote.DisconnectReason;
import java.util.ArrayList;
import java.util.Locale;
import java.util.UUID;

View file

@ -28,6 +28,7 @@
package mage.server;
import mage.remote.DisconnectReason;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

View file

@ -60,6 +60,7 @@ import mage.interfaces.ActionWithResult;
import org.mage.network.interfaces.MageServer;
import mage.interfaces.ServerState;
import mage.interfaces.callback.ClientCallback;
import mage.remote.DisconnectReason;
import mage.remote.MageVersionException;
import mage.server.draft.CubeFactory;
import mage.server.draft.DraftManager;
@ -1114,6 +1115,12 @@ public class Main implements MageServer {
// }, true);
// }
//
@Override
public void disconnect(String sessionId, DisconnectReason reason) {
SessionManager.getInstance().disconnect(sessionId, reason);
}
// @Override
// public void disconnectUser(final String sessionId, final String userSessionId) throws MageException {
// execute("disconnectUser", sessionId, new Action() {

View file

@ -28,6 +28,7 @@
package mage.server;
import mage.remote.DisconnectReason;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

View file

@ -27,6 +27,7 @@
*/
package mage.server;
import mage.remote.DisconnectReason;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

View file

@ -27,6 +27,7 @@
*/
package mage.server;
import mage.remote.DisconnectReason;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;

View file

@ -27,6 +27,7 @@
*/
package mage.server;
import mage.remote.DisconnectReason;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;