优化网络连接处理:调整日志级别,增加重连控制逻辑

This commit is contained in:
Xujiayao 2026-01-21 00:10:38 +08:00
parent 421e24b5f0
commit 1d14bc3e7e
3 changed files with 21 additions and 11 deletions

View file

@ -28,6 +28,7 @@ public class ClientHandler extends SimpleChannelInboundHandler<Packet> {
private final NettyClient client;
private final CompletableFuture<Boolean> initialLoginFuture;
private boolean allowReconnect = true; // Default to true for network errors
public ClientHandler(NettyClient client, CompletableFuture<Boolean> initialLoginFuture) {
this.client = client;
@ -41,12 +42,16 @@ public class ClientHandler extends SimpleChannelInboundHandler<Packet> {
@Override
public void channelInactive(ChannelHandlerContext ctx) {
LOGGER.info(I18nManager.getDmccTranslation("client.network.disconnected_generic"));
LOGGER.warn(I18nManager.getDmccTranslation("client.network.disconnected_generic"));
// Trigger reconnection if this was not an intentional stop
if (client.isRunning()) {
LOGGER.info(I18nManager.getDmccTranslation("client.network.reconnecting"));
// Trigger reconnection if this was not an intentional stop AND the server didn't explicitly reject us
if (client.isRunning() && allowReconnect) {
LOGGER.warn(I18nManager.getDmccTranslation("client.network.reconnecting"));
client.scheduleReconnect();
} else {
// If we are not allowed to reconnect, we should probably stop the client fully
// to prevent any background threads from lingering or confusing state.
client.stop();
}
}
@ -65,6 +70,11 @@ public class ClientHandler extends SimpleChannelInboundHandler<Packet> {
}
} else if (packet instanceof DisconnectPacket p) {
// If we receive a DisconnectPacket, it means the server explicitly rejected us.
// In most cases (whitelist, auth fail, version mismatch), retrying immediately won't help.
// So we disable reconnection.
allowReconnect = false;
String reason = I18nManager.getDmccTranslation(p.key, p.args);
LOGGER.error(I18nManager.getDmccTranslation("client.network.disconnected_reason", reason));

View file

@ -105,7 +105,7 @@ public class NettyClient {
b.connect(host, port).addListener((ChannelFuture future) -> {
if (future.isSuccess()) {
// Connection established
reconnectDelay.set(2); // Reset delay on success
reconnectDelay.set(1); // Reset delay on success
} else {
if (isInitialAttempt) {
initialLoginFuture.completeExceptionally(future.cause());

View file

@ -44,7 +44,7 @@ public class ServerHandler extends SimpleChannelInboundHandler<Packet> {
@Override
public void channelInactive(ChannelHandlerContext ctx) {
if (clientName != null) {
LOGGER.info(I18nManager.getDmccTranslation("server.network.client_disconnected_normal", clientName));
LOGGER.warn(I18nManager.getDmccTranslation("server.network.client_disconnected_normal", clientName));
}
}
@ -54,7 +54,7 @@ public class ServerHandler extends SimpleChannelInboundHandler<Packet> {
case HandshakePacket p -> {
if (!isWhitelisted(p.serverName)) {
String reason = I18nManager.getDmccTranslation("server.network.disconnect_reasons.not_whitelisted", p.serverName);
LOGGER.warn(I18nManager.getDmccTranslation("server.network.reject", clientName, reason));
LOGGER.error(I18nManager.getDmccTranslation("server.network.reject", p.serverName, reason));
ctx.writeAndFlush(new DisconnectPacket("server.network.disconnect_reasons.not_whitelisted", p.serverName));
ctx.close();
return;
@ -62,7 +62,7 @@ public class ServerHandler extends SimpleChannelInboundHandler<Packet> {
if (!Constants.VERSION.equals(p.version)) {
String reason = I18nManager.getDmccTranslation("server.network.disconnect_reasons.version_mismatch", p.version, Constants.VERSION);
LOGGER.warn(I18nManager.getDmccTranslation("server.network.reject", clientName, reason));
LOGGER.error(I18nManager.getDmccTranslation("server.network.reject", clientName, reason));
ctx.writeAndFlush(new DisconnectPacket("server.network.disconnect_reasons.version_mismatch", p.version, Constants.VERSION));
ctx.close();
return;
@ -82,7 +82,7 @@ public class ServerHandler extends SimpleChannelInboundHandler<Packet> {
// TODO: Add to active clients list
} else {
String reason = I18nManager.getDmccTranslation("server.network.disconnect_reasons.auth_failed");
LOGGER.warn(I18nManager.getDmccTranslation("server.network.reject", clientName, reason));
LOGGER.error(I18nManager.getDmccTranslation("server.network.reject", clientName, reason));
ctx.writeAndFlush(new DisconnectPacket("server.network.disconnect_reasons.auth_failed"));
ctx.close();
}
@ -94,7 +94,7 @@ public class ServerHandler extends SimpleChannelInboundHandler<Packet> {
// Handle other packets if authenticated
if (!authenticated) {
String reason = I18nManager.getDmccTranslation("server.network.disconnect_reasons.not_authenticated");
LOGGER.warn(I18nManager.getDmccTranslation("server.network.reject", clientName, reason));
LOGGER.error(I18nManager.getDmccTranslation("server.network.reject", clientName, reason));
ctx.writeAndFlush(new DisconnectPacket("server.network.disconnect_reasons.not_authenticated"));
ctx.close();
}
@ -106,7 +106,7 @@ public class ServerHandler extends SimpleChannelInboundHandler<Packet> {
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent e) {
if (e.state() == IdleState.READER_IDLE) {
LOGGER.warn(I18nManager.getDmccTranslation("server.network.client_timeout", clientName != null ? clientName : "unknown"));
LOGGER.error(I18nManager.getDmccTranslation("server.network.client_timeout", clientName != null ? clientName : "unknown"));
ctx.close();
}
} else {