commit
1b4cfe4e39
|
|
@ -23,9 +23,6 @@ public class ChatSyncClient {
|
||||||
private static final int RECONNECT_DELAY = 5000;
|
private static final int RECONNECT_DELAY = 5000;
|
||||||
private static final int MAX_RECONNECT_ATTEMPTS = 10;
|
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() {
|
public void run() {
|
||||||
int reconnectAttempts = 0;
|
int reconnectAttempts = 0;
|
||||||
|
|
||||||
|
|
@ -48,33 +45,25 @@ public class ChatSyncClient {
|
||||||
15000
|
15000
|
||||||
);
|
);
|
||||||
|
|
||||||
clientSocket.setSoTimeout(30000);
|
clientSocket.setSoTimeout(0);
|
||||||
|
|
||||||
out = new PrintWriter(new BufferedWriter(
|
out = new PrintWriter(new BufferedWriter(
|
||||||
new OutputStreamWriter(clientSocket.getOutputStream())), true);
|
new OutputStreamWriter(clientSocket.getOutputStream())), true);
|
||||||
|
|
||||||
PlayerSync.LOGGER.info("Successfully connected to chat server");
|
PlayerSync.LOGGER.info("Successfully connected to chat server");
|
||||||
reconnectAttempts = 0;
|
reconnectAttempts = 0;
|
||||||
lastHeartbeat = System.currentTimeMillis();
|
|
||||||
|
|
||||||
startHeartbeatMonitor();
|
|
||||||
|
|
||||||
BufferedReader in = new BufferedReader(
|
BufferedReader in = new BufferedReader(
|
||||||
new InputStreamReader(clientSocket.getInputStream()));
|
new InputStreamReader(clientSocket.getInputStream()));
|
||||||
|
|
||||||
String serverMessage;
|
String serverMessage;
|
||||||
while (running && (serverMessage = in.readLine()) != null) {
|
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);
|
Component textComponents = Component.nullToEmpty(serverMessage);
|
||||||
if(playerList != null){
|
if(playerList != null){
|
||||||
playerList.getServer().execute(() ->
|
playerList.getServer().execute(() ->
|
||||||
playerList.broadcastSystemMessage(textComponents, false));
|
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() {
|
private void closeConnection() {
|
||||||
try {
|
try {
|
||||||
if (out != null) {
|
if (out != null) {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,10 @@ package vip.fubuki.playersync.sync.chat;
|
||||||
import vip.fubuki.playersync.PlayerSync;
|
import vip.fubuki.playersync.PlayerSync;
|
||||||
import vip.fubuki.playersync.config.JdbcConfig;
|
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.ServerSocket;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.net.SocketTimeoutException;
|
import java.net.SocketTimeoutException;
|
||||||
|
|
@ -26,12 +29,10 @@ public class ChatSyncServer {
|
||||||
serverSocket.setReuseAddress(true);
|
serverSocket.setReuseAddress(true);
|
||||||
PlayerSync.LOGGER.info("Chat server started successfully on port {}", JdbcConfig.CHAT_SERVER_PORT.get());
|
PlayerSync.LOGGER.info("Chat server started successfully on port {}", JdbcConfig.CHAT_SERVER_PORT.get());
|
||||||
|
|
||||||
startHeartbeatBroadcast();
|
|
||||||
|
|
||||||
while (running && !Thread.currentThread().isInterrupted()) {
|
while (running && !Thread.currentThread().isInterrupted()) {
|
||||||
try {
|
try {
|
||||||
Socket newSocket = serverSocket.accept();
|
Socket newSocket = serverSocket.accept();
|
||||||
newSocket.setSoTimeout(30000);
|
newSocket.setSoTimeout(0);
|
||||||
SocketList.add(newSocket);
|
SocketList.add(newSocket);
|
||||||
executorService.submit(() -> handleClient(newSocket));
|
executorService.submit(() -> handleClient(newSocket));
|
||||||
PlayerSync.LOGGER.info("New client connected, total clients: {}", SocketList.size());
|
PlayerSync.LOGGER.info("New client connected, total clients: {}", SocketList.size());
|
||||||
|
|
@ -54,7 +55,6 @@ public class ChatSyncServer {
|
||||||
|
|
||||||
String message;
|
String message;
|
||||||
while (running && (message = reader.readLine()) != null) {
|
while (running && (message = reader.readLine()) != null) {
|
||||||
PlayerSync.LOGGER.info("Received message from {}: {}", clientInfo, message);
|
|
||||||
broadcastMessage(socket, 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() {
|
public void shutdown() {
|
||||||
running = false;
|
running = false;
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user