diff --git a/src/main/java/com/github/jie65535/opencommand/socket/SocketClient.java b/src/main/java/com/github/jie65535/opencommand/socket/SocketClient.java index cf0fc14..3f63331 100644 --- a/src/main/java/com/github/jie65535/opencommand/socket/SocketClient.java +++ b/src/main/java/com/github/jie65535/opencommand/socket/SocketClient.java @@ -96,49 +96,53 @@ public class SocketClient { public void run() { //noinspection InfiniteLoopStatement while (true) { - String data = SocketUtils.readString(is); - Packet packet = Grasscutter.getGsonFactory().fromJson(data, Packet.class); - if (packet.token.equals(token)) { - switch (packet.type) { - // 玩家类 - case Player: - var player = Grasscutter.getGsonFactory().fromJson(packet.data, Player.class); - switch (player.type) { - // 运行命令 - case RunCommand -> { - var command = player.data; - var playerData = OpenCommandPlugin.getInstance().getServer().getPlayerByUid(player.uid); - if (playerData == null) { - sendPacket(new HttpPacket(404, "Player not found."), packet.packetID); - return; - } - // Player MessageHandler do not support concurrency - //noinspection SynchronizationOnLocalVariableOrMethodParameter - synchronized (playerData) { - try { - var resultCollector = new MessageHandler(); - playerData.setMessageHandler(resultCollector); - CommandMap.getInstance().invoke(playerData, playerData, command); - sendPacket(new HttpPacket(200, resultCollector.getMessage()), packet.packetID); - } catch (Exception e) { - OpenCommandPlugin.getInstance().getLogger().warn("Run command failed.", e); - sendPacket(new HttpPacket(500, "error", e.getLocalizedMessage()), packet.packetID); - } finally { - playerData.setMessageHandler(null); + try { + String data = SocketUtils.readString(is); + Packet packet = Grasscutter.getGsonFactory().fromJson(data, Packet.class); + if (packet.token.equals(token)) { + switch (packet.type) { + // 玩家类 + case Player: + var player = Grasscutter.getGsonFactory().fromJson(packet.data, Player.class); + switch (player.type) { + // 运行命令 + case RunCommand -> { + var command = player.data; + var playerData = OpenCommandPlugin.getInstance().getServer().getPlayerByUid(player.uid); + if (playerData == null) { + sendPacket(new HttpPacket(404, "Player not found."), packet.packetID); + return; + } + // Player MessageHandler do not support concurrency + //noinspection SynchronizationOnLocalVariableOrMethodParameter + synchronized (playerData) { + try { + var resultCollector = new MessageHandler(); + playerData.setMessageHandler(resultCollector); + CommandMap.getInstance().invoke(playerData, playerData, command); + sendPacket(new HttpPacket(200, resultCollector.getMessage()), packet.packetID); + } catch (Exception e) { + OpenCommandPlugin.getInstance().getLogger().warn("Run command failed.", e); + sendPacket(new HttpPacket(500, "error", e.getLocalizedMessage()), packet.packetID); + } finally { + playerData.setMessageHandler(null); + } } } - } - // 发送信息 - case DropMessage -> { - var playerData = OpenCommandPlugin.getInstance().getServer().getPlayerByUid(player.uid); - if (playerData == null) { - return; + // 发送信息 + case DropMessage -> { + var playerData = OpenCommandPlugin.getInstance().getServer().getPlayerByUid(player.uid); + if (playerData == null) { + return; + } + playerData.dropMessage(player.data); } - playerData.dropMessage(player.data); } - } - break; + break; + } } + } catch (Throwable e) { + e.printStackTrace(); } } } diff --git a/src/main/java/com/github/jie65535/opencommand/socket/SocketServer.java b/src/main/java/com/github/jie65535/opencommand/socket/SocketServer.java index 1b41131..b602a87 100644 --- a/src/main/java/com/github/jie65535/opencommand/socket/SocketServer.java +++ b/src/main/java/com/github/jie65535/opencommand/socket/SocketServer.java @@ -24,7 +24,6 @@ public class SocketServer { private static final HashMap clientList = new HashMap<>(); private static final HashMap clientTimeout = new HashMap<>(); - private static Logger mLogger; public static void startServer() throws IOException { @@ -145,31 +144,40 @@ public class SocketServer { public void run() { // noinspection InfiniteLoopStatement while (true) { - String data = SocketUtils.readString(is); - Packet packet = Grasscutter.getGsonFactory().fromJson(data, Packet.class); - if (packet.token.equals(token)) { - switch (packet.type) { - // 缓存玩家列表 - case PlayerList -> { - PlayerList playerList = Grasscutter.getGsonFactory().fromJson(packet.data, PlayerList.class); - SocketData.playerList.put(address, playerList); - } - // Http信息返回 - case HttpPacket -> { - HttpPacket httpPacket = Grasscutter.getGsonFactory().fromJson(packet.data, HttpPacket.class); - var socketWait = socketDataWaitList.get(packet.packetID); - if (socketWait == null) { - mLogger.error("HttpPacket: " + packet.packetID + " not found"); - return; + try { + String data = SocketUtils.readString(is); + Packet packet = Grasscutter.getGsonFactory().fromJson(data, Packet.class); + if (packet.token.equals(token)) { + switch (packet.type) { + // 缓存玩家列表 + case PlayerList -> { + PlayerList playerList = Grasscutter.getGsonFactory().fromJson(packet.data, PlayerList.class); + SocketData.playerList.put(address, playerList); + } + // Http信息返回 + case HttpPacket -> { + HttpPacket httpPacket = Grasscutter.getGsonFactory().fromJson(packet.data, HttpPacket.class); + var socketWait = socketDataWaitList.get(packet.packetID); + if (socketWait == null) { + mLogger.error("HttpPacket: " + packet.packetID + " not found"); + return; + } + socketWait.setData(httpPacket); + socketDataWaitList.remove(packet.packetID); + } + // 心跳包 + case HeartBeat -> { + clientTimeout.put(address, 0); } - socketWait.setData(httpPacket); - socketDataWaitList.remove(packet.packetID); - } - // 心跳包 - case HeartBeat -> { - clientTimeout.put(address, 0); } } + } catch (Throwable e) { + e.printStackTrace(); + mLogger.error("[OpenCommand] Client {} disconnect.", address); + clientList.remove(address); + clientTimeout.remove(address); + SocketData.playerList.remove(address); + break; } } }