improved disconnect handling

This commit is contained in:
betasteward 2015-08-17 08:47:19 -04:00
parent 8bff961caf
commit 9be04769f9
7 changed files with 80 additions and 40 deletions

View file

@ -33,7 +33,7 @@ import mage.view.TournamentView;
import mage.view.UserDataView;
import mage.view.UserView;
import org.apache.log4j.Logger;
import org.mage.network.handlers.ExceptionHandler;
import org.mage.network.handlers.client.ClientExceptionHandler;
import org.mage.network.handlers.PingMessageHandler;
import org.mage.network.handlers.client.ClientMessageHandler;
import org.mage.network.handlers.client.ClientRegisteredMessageHandler;
@ -57,7 +57,7 @@ public class Client {
private final ClientMessageHandler clientMessageHandler;
private final ClientRegisteredMessageHandler clientRegisteredMessageHandler;
private final ExceptionHandler exceptionHandler;
private final ClientExceptionHandler exceptionHandler;
private SslContext sslCtx;
private Channel channel;
@ -72,7 +72,7 @@ public class Client {
clientMessageHandler = new ClientMessageHandler(client);
clientRegisteredMessageHandler = new ClientRegisteredMessageHandler();
exceptionHandler = new ExceptionHandler();
exceptionHandler = new ClientExceptionHandler(this);
}
public boolean connect(Connection connection, MageVersion version) {

View file

@ -36,15 +36,14 @@ import mage.view.GameEndView;
import mage.view.GameView;
import mage.view.UserRequestMessage;
import org.apache.log4j.Logger;
import org.mage.network.handlers.ExceptionHandler;
import org.mage.network.handlers.PingMessageHandler;
import org.mage.network.handlers.WriteListener;
import org.mage.network.handlers.server.ConnectionHandler;
import org.mage.network.handlers.server.HeartbeatHandler;
import org.mage.network.handlers.server.ServerExceptionHandler;
import org.mage.network.handlers.server.ServerRequestHandler;
import org.mage.network.interfaces.MageServer;
import org.mage.network.messages.MessageType;
import org.mage.network.messages.PingMessage;
import org.mage.network.messages.callback.ChatMessageCallback;
import org.mage.network.messages.callback.ConstructCallback;
import org.mage.network.messages.callback.DraftInitCallback;
@ -87,7 +86,7 @@ public class Server {
private static final int IDLE_PING_TIME = 30;
private static final int IDLE_TIMEOUT = 60;
private static final PingMessage ping = new PingMessage();
// private static final PingMessage ping = new PingMessage();
public static final ChannelGroup clients = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
@ -99,13 +98,13 @@ public class Server {
private final EventExecutorGroup handlersExecutor = new DefaultEventExecutorGroup(Runtime.getRuntime().availableProcessors() * 2);
private final ServerRequestHandler serverMessageHandler;
private final ExceptionHandler exceptionHandler;
private final ServerExceptionHandler exceptionHandler;
public Server(MageServer server) {
this.server = server;
// h = new MessageHandler();
serverMessageHandler = new ServerRequestHandler(server);
exceptionHandler = new ExceptionHandler();
exceptionHandler = new ServerExceptionHandler(server);
}
public void start(int port, boolean ssl) throws Exception {

View file

@ -1,23 +0,0 @@
package org.mage.network.handlers;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import org.apache.log4j.Logger;
/**
*
* @author BetaSteward
*/
@Sharable
public class ExceptionHandler extends ChannelHandlerAdapter {
private static final Logger logger = Logger.getLogger(ExceptionHandler.class);
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
logger.error("Communications error", cause);
ctx.close();
}
}

View file

@ -0,0 +1,31 @@
package org.mage.network.handlers.client;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import org.apache.log4j.Logger;
import org.mage.network.Client;
/**
*
* @author BetaSteward
*/
@Sharable
public class ClientExceptionHandler extends ChannelHandlerAdapter {
private static final Logger logger = Logger.getLogger(ClientExceptionHandler.class);
private Client client;
public ClientExceptionHandler(Client client) {
this.client = client;
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
logger.error("Communications error", cause);
client.disconnect(true);
//ctx.close();
}
}

View file

@ -2,7 +2,6 @@ package org.mage.network.handlers.server;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import org.apache.log4j.Logger;
import org.mage.network.Server;
/**
@ -11,7 +10,7 @@ import org.mage.network.Server;
*/
public class ConnectionHandler extends ChannelHandlerAdapter {
private static final Logger logger = Logger.getLogger(ConnectionHandler.class);
// private static final Logger logger = Logger.getLogger(ConnectionHandler.class);
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
@ -19,10 +18,10 @@ public class ConnectionHandler extends ChannelHandlerAdapter {
super.channelActive(ctx);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
logger.error("Communications error", cause);
ctx.close();
}
// @Override
// public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
// logger.error("Communications error", cause);
// ctx.close();
// }
}

View file

@ -0,0 +1,32 @@
package org.mage.network.handlers.server;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import mage.remote.DisconnectReason;
import org.apache.log4j.Logger;
import org.mage.network.interfaces.MageServer;
/**
*
* @author BetaSteward
*/
@Sharable
public class ServerExceptionHandler extends ChannelHandlerAdapter {
private static final Logger logger = Logger.getLogger(ServerExceptionHandler.class);
private MageServer server;
public ServerExceptionHandler(MageServer server) {
this.server = server;
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
logger.error("Communications error", cause);
server.disconnect(ctx.channel().id().asLongText(), DisconnectReason.Undefined);
//ctx.close();
}
}

View file

@ -112,10 +112,12 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable {
}
}
List<UsersView> users = new ArrayList<>();
String pingInfo;
for (User user : UserManager.getInstance().getUsers()) {
Session session = SessionManager.getInstance().getSession(user.getSessionId());
pingInfo = session == null ? "<no ping>" : session.getPingInfo();
try {
users.add(new UsersView(user.getUserData().getFlagName(), user.getName(), user.getInfo(), user.getGameInfo(), session.getPingInfo()));
users.add(new UsersView(user.getUserData().getFlagName(), user.getName(), user.getInfo(), user.getGameInfo(), pingInfo));
} catch (Exception ex) {
logger.fatal("User update exception: " + user.getName() + " - " + ex.toString(), ex);
users.add(new UsersView(
@ -123,7 +125,7 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable {
user.getName() != null ? user.getName() : "<no name>",
user.getInfo() != null ? user.getInfo() : "<no info>",
"[exception]",
session.getPingInfo() != null ? session.getPingInfo() : "<no ping>"));
pingInfo));
}
}