NetworkManager

This commit is contained in:
Xujiayao 2026-01-21 22:01:15 +08:00
parent cb2409ca95
commit 27ef4a3f7d
4 changed files with 85 additions and 1 deletions

View file

@ -2,6 +2,7 @@ package com.xujiayao.discord_mc_chat;
import com.xujiayao.discord_mc_chat.client.ClientDMCC;
import com.xujiayao.discord_mc_chat.commands.CommandManager;
import com.xujiayao.discord_mc_chat.network.NetworkManager;
import com.xujiayao.discord_mc_chat.server.ServerDMCC;
import com.xujiayao.discord_mc_chat.utils.CryptUtils;
import com.xujiayao.discord_mc_chat.utils.config.ConfigManager;
@ -161,6 +162,9 @@ public class DMCC {
public static boolean shutdown() {
try (ExecutorService executor = Executors.newSingleThreadExecutor(r -> new Thread(r, "DMCC-Shutdown"))) {
return executor.submit(() -> {
// Clear the network manager references first
NetworkManager.clear();
if (clientInstance != null) {
clientInstance.shutdown();
clientInstance = null;

View file

@ -1,5 +1,6 @@
package com.xujiayao.discord_mc_chat.client;
import com.xujiayao.discord_mc_chat.network.NetworkManager;
import com.xujiayao.discord_mc_chat.network.packets.Packet;
import com.xujiayao.discord_mc_chat.utils.i18n.I18nManager;
@ -32,7 +33,12 @@ public class ClientDMCC {
try (ExecutorService executor = Executors.newSingleThreadExecutor(r -> new Thread(r, "DMCC-Client"))) {
return executor.submit(() -> {
nettyClient = new NettyClient(host, port, serverName, sharedSecret);
return nettyClient.start();
boolean success = nettyClient.start();
if (success) {
// Register to NetworkManager on successful start
NetworkManager.registerClient(this);
}
return success;
}).get();
} catch (Exception e) {
LOGGER.error(I18nManager.getDmccTranslation("client.startup_interrupted"), e);

View file

@ -0,0 +1,68 @@
package com.xujiayao.discord_mc_chat.network;
import com.xujiayao.discord_mc_chat.client.ClientDMCC;
import com.xujiayao.discord_mc_chat.network.packets.Packet;
import com.xujiayao.discord_mc_chat.server.ServerDMCC;
import java.util.concurrent.atomic.AtomicReference;
/**
* Central access point for sending network packets.
*
* @author Xujiayao
*/
public class NetworkManager {
private static final AtomicReference<ClientDMCC> clientInstance = new AtomicReference<>();
private static final AtomicReference<ServerDMCC> serverInstance = new AtomicReference<>();
public static void registerClient(ClientDMCC client) {
clientInstance.set(client);
}
public static void registerServer(ServerDMCC server) {
serverInstance.set(server);
}
public static void clear() {
clientInstance.set(null);
serverInstance.set(null);
}
/**
* Sends a packet to the server. Should be called from client only.
*
* @param packet The packet to send
*/
public static void sendPacketToServer(Packet packet) {
ClientDMCC client = clientInstance.get();
if (client != null) {
client.sendPacket(packet);
}
}
// /**
// * Sends a packet to a client. Should be called from server only.
// *
// * @param packet The packet to send
// * @param targetName The target client's name
// */
// public static void sendPacketToClient(Packet packet, String targetName) {
// ServerDMCC server = serverInstance.get();
// if (server != null) {
// server.sendPacket(packet);
// }
// }
//
// /**
// * Sends a packet to all clients. Should be called from server only.
// *
// * @param packet The packet to send
// */
// public static void sendPacketToAll(Packet packet) {
// ServerDMCC server = serverInstance.get();
// if (server != null) {
// server.sendPacket(packet);
// }
// }
}

View file

@ -1,5 +1,6 @@
package com.xujiayao.discord_mc_chat.server;
import com.xujiayao.discord_mc_chat.network.NetworkManager;
import com.xujiayao.discord_mc_chat.server.discord.DiscordManager;
import com.xujiayao.discord_mc_chat.utils.i18n.I18nManager;
@ -42,6 +43,11 @@ public class ServerDMCC {
nettyServer = new NettyServer(host, port, sharedSecret);
port = nettyServer.start();
if (port != -1) {
// Register to NetworkManager on successful start
NetworkManager.registerServer(this);
}
return port;
}).get();
} catch (Exception e) {