mirror of
https://github.com/magefree/mage.git
synced 2025-12-24 12:31:59 -08:00
added disconnect handling
This commit is contained in:
parent
b68cd765b7
commit
2143e87543
18 changed files with 99 additions and 24 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
package mage.server;
|
||||
package mage.remote;
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
package mage.server;
|
||||
|
||||
import mage.remote.DisconnectReason;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Locale;
|
||||
import java.util.UUID;
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
package mage.server;
|
||||
|
||||
import mage.remote.DisconnectReason;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
package mage.server;
|
||||
|
||||
import mage.remote.DisconnectReason;
|
||||
import java.util.Date;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
*/
|
||||
package mage.server;
|
||||
|
||||
import mage.remote.DisconnectReason;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
*/
|
||||
package mage.server;
|
||||
|
||||
import mage.remote.DisconnectReason;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
*/
|
||||
package mage.server;
|
||||
|
||||
import mage.remote.DisconnectReason;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Collection;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue