Merge pull request #137 from mlus-asuka/1.20.1-dev

1.20.1 dev
This commit is contained in:
mlus 2025-11-20 11:48:34 +08:00 committed by GitHub
commit 1b4cfe4e39
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 8 additions and 86 deletions

View File

@ -23,9 +23,6 @@ public class ChatSyncClient {
private static final int RECONNECT_DELAY = 5000;
private static final int MAX_RECONNECT_ATTEMPTS = 10;
private static volatile long lastHeartbeat = System.currentTimeMillis();
private static final long HEARTBEAT_INTERVAL = 15000;
public void run() {
int reconnectAttempts = 0;
@ -48,33 +45,25 @@ public class ChatSyncClient {
15000
);
clientSocket.setSoTimeout(30000);
clientSocket.setSoTimeout(0);
out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(clientSocket.getOutputStream())), true);
PlayerSync.LOGGER.info("Successfully connected to chat server");
reconnectAttempts = 0;
lastHeartbeat = System.currentTimeMillis();
startHeartbeatMonitor();
BufferedReader in = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
String serverMessage;
while (running && (serverMessage = in.readLine()) != null) {
lastHeartbeat = System.currentTimeMillis();
if ("<heartbeat>".equals(serverMessage)) {
continue;
}
PlayerSync.LOGGER.info("Received message from chat server: " + serverMessage);
Component textComponents = Component.nullToEmpty(serverMessage);
if(playerList != null){
playerList.getServer().execute(() ->
playerList.broadcastSystemMessage(textComponents, false));
}else {
PlayerSync.LOGGER.info("Received message from chat server: " + serverMessage);
}
}
@ -104,32 +93,6 @@ public class ChatSyncClient {
}
}
private void startHeartbeatMonitor() {
Thread heartbeatThread = new Thread(() -> {
while (running && clientSocket != null && !clientSocket.isClosed()) {
try {
Thread.sleep(10000); // 每10秒检查一次
long now = System.currentTimeMillis();
if (now - lastHeartbeat > HEARTBEAT_INTERVAL) {
PlayerSync.LOGGER.warn("No heartbeat for {}ms, sending test message",
now - lastHeartbeat);
// 发送测试消息检查连接
if (out != null) {
out.println("<heartbeat>");
}
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}, "ChatSync-Heartbeat");
heartbeatThread.setDaemon(true);
heartbeatThread.start();
}
private void closeConnection() {
try {
if (out != null) {

View File

@ -3,7 +3,10 @@ package vip.fubuki.playersync.sync.chat;
import vip.fubuki.playersync.PlayerSync;
import vip.fubuki.playersync.config.JdbcConfig;
import java.io.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
@ -26,12 +29,10 @@ public class ChatSyncServer {
serverSocket.setReuseAddress(true);
PlayerSync.LOGGER.info("Chat server started successfully on port {}", JdbcConfig.CHAT_SERVER_PORT.get());
startHeartbeatBroadcast();
while (running && !Thread.currentThread().isInterrupted()) {
try {
Socket newSocket = serverSocket.accept();
newSocket.setSoTimeout(30000);
newSocket.setSoTimeout(0);
SocketList.add(newSocket);
executorService.submit(() -> handleClient(newSocket));
PlayerSync.LOGGER.info("New client connected, total clients: {}", SocketList.size());
@ -54,7 +55,6 @@ public class ChatSyncServer {
String message;
while (running && (message = reader.readLine()) != null) {
PlayerSync.LOGGER.info("Received message from {}: {}", clientInfo, message);
broadcastMessage(socket, message);
}
@ -96,47 +96,6 @@ public class ChatSyncServer {
}
}
private void startHeartbeatBroadcast() {
Thread heartbeatThread = new Thread(() -> {
while (running) {
try {
Thread.sleep(20000);
broadcastHeartbeat();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}, "ChatSync-Server-Heartbeat");
heartbeatThread.setDaemon(true);
heartbeatThread.start();
}
private void broadcastHeartbeat() {
Iterator<Socket> iterator = SocketList.iterator();
while (iterator.hasNext()) {
Socket socket = iterator.next();
if (!socket.isClosed()) {
try {
PrintWriter writer = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
writer.println("<heartbeat>");
} catch (IOException e) {
PlayerSync.LOGGER.warn("Failed to send heartbeat to client, removing: {}", e.getMessage());
iterator.remove();
try {
socket.close();
} catch (IOException ex) {
// Ignore
}
}
} else {
iterator.remove();
}
}
}
public void shutdown() {
running = false;
try {