Prevent some exceptions

This commit is contained in:
方块君 2022-07-22 14:44:22 +08:00
parent 67f3eb180d
commit 8030ef8034
2 changed files with 73 additions and 61 deletions

View File

@ -96,49 +96,53 @@ public class SocketClient {
public void run() { public void run() {
//noinspection InfiniteLoopStatement //noinspection InfiniteLoopStatement
while (true) { while (true) {
String data = SocketUtils.readString(is); try {
Packet packet = Grasscutter.getGsonFactory().fromJson(data, Packet.class); String data = SocketUtils.readString(is);
if (packet.token.equals(token)) { Packet packet = Grasscutter.getGsonFactory().fromJson(data, Packet.class);
switch (packet.type) { if (packet.token.equals(token)) {
// 玩家类 switch (packet.type) {
case Player: // 玩家类
var player = Grasscutter.getGsonFactory().fromJson(packet.data, Player.class); case Player:
switch (player.type) { var player = Grasscutter.getGsonFactory().fromJson(packet.data, Player.class);
// 运行命令 switch (player.type) {
case RunCommand -> { // 运行命令
var command = player.data; case RunCommand -> {
var playerData = OpenCommandPlugin.getInstance().getServer().getPlayerByUid(player.uid); var command = player.data;
if (playerData == null) { var playerData = OpenCommandPlugin.getInstance().getServer().getPlayerByUid(player.uid);
sendPacket(new HttpPacket(404, "Player not found."), packet.packetID); if (playerData == null) {
return; sendPacket(new HttpPacket(404, "Player not found."), packet.packetID);
} return;
// Player MessageHandler do not support concurrency }
//noinspection SynchronizationOnLocalVariableOrMethodParameter // Player MessageHandler do not support concurrency
synchronized (playerData) { //noinspection SynchronizationOnLocalVariableOrMethodParameter
try { synchronized (playerData) {
var resultCollector = new MessageHandler(); try {
playerData.setMessageHandler(resultCollector); var resultCollector = new MessageHandler();
CommandMap.getInstance().invoke(playerData, playerData, command); playerData.setMessageHandler(resultCollector);
sendPacket(new HttpPacket(200, resultCollector.getMessage()), packet.packetID); CommandMap.getInstance().invoke(playerData, playerData, command);
} catch (Exception e) { sendPacket(new HttpPacket(200, resultCollector.getMessage()), packet.packetID);
OpenCommandPlugin.getInstance().getLogger().warn("Run command failed.", e); } catch (Exception e) {
sendPacket(new HttpPacket(500, "error", e.getLocalizedMessage()), packet.packetID); OpenCommandPlugin.getInstance().getLogger().warn("Run command failed.", e);
} finally { sendPacket(new HttpPacket(500, "error", e.getLocalizedMessage()), packet.packetID);
playerData.setMessageHandler(null); } finally {
playerData.setMessageHandler(null);
}
} }
} }
} // 发送信息
// 发送信息 case DropMessage -> {
case DropMessage -> { var playerData = OpenCommandPlugin.getInstance().getServer().getPlayerByUid(player.uid);
var playerData = OpenCommandPlugin.getInstance().getServer().getPlayerByUid(player.uid); if (playerData == null) {
if (playerData == null) { return;
return; }
playerData.dropMessage(player.data);
} }
playerData.dropMessage(player.data);
} }
} break;
break; }
} }
} catch (Throwable e) {
e.printStackTrace();
} }
} }
} }

View File

@ -24,7 +24,6 @@ public class SocketServer {
private static final HashMap<String, ClientThread> clientList = new HashMap<>(); private static final HashMap<String, ClientThread> clientList = new HashMap<>();
private static final HashMap<String, Integer> clientTimeout = new HashMap<>(); private static final HashMap<String, Integer> clientTimeout = new HashMap<>();
private static Logger mLogger; private static Logger mLogger;
public static void startServer() throws IOException { public static void startServer() throws IOException {
@ -145,31 +144,40 @@ public class SocketServer {
public void run() { public void run() {
// noinspection InfiniteLoopStatement // noinspection InfiniteLoopStatement
while (true) { while (true) {
String data = SocketUtils.readString(is); try {
Packet packet = Grasscutter.getGsonFactory().fromJson(data, Packet.class); String data = SocketUtils.readString(is);
if (packet.token.equals(token)) { Packet packet = Grasscutter.getGsonFactory().fromJson(data, Packet.class);
switch (packet.type) { if (packet.token.equals(token)) {
// 缓存玩家列表 switch (packet.type) {
case PlayerList -> { // 缓存玩家列表
PlayerList playerList = Grasscutter.getGsonFactory().fromJson(packet.data, PlayerList.class); case PlayerList -> {
SocketData.playerList.put(address, playerList); PlayerList playerList = Grasscutter.getGsonFactory().fromJson(packet.data, PlayerList.class);
} SocketData.playerList.put(address, playerList);
// Http信息返回 }
case HttpPacket -> { // Http信息返回
HttpPacket httpPacket = Grasscutter.getGsonFactory().fromJson(packet.data, HttpPacket.class); case HttpPacket -> {
var socketWait = socketDataWaitList.get(packet.packetID); HttpPacket httpPacket = Grasscutter.getGsonFactory().fromJson(packet.data, HttpPacket.class);
if (socketWait == null) { var socketWait = socketDataWaitList.get(packet.packetID);
mLogger.error("HttpPacket: " + packet.packetID + " not found"); if (socketWait == null) {
return; 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;
} }
} }
} }