diff --git a/TestClientHandler.java b/TestClientHandler.java new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/TestClientHandler.java @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/java/BsK/client/network/handler/ClientHandler.java b/src/main/java/BsK/client/network/handler/ClientHandler.java index b4194b1..8c0b5da 100644 --- a/src/main/java/BsK/client/network/handler/ClientHandler.java +++ b/src/main/java/BsK/client/network/handler/ClientHandler.java @@ -34,6 +34,41 @@ public class ClientHandler extends SimpleChannelInboundHandler "Server Timeout - Server stopped responding"; + case CONNECTION_LOST -> "Connection Lost - Network disconnected abruptly"; + case NETWORK_ERROR -> "Network Error - Data transmission issues"; + case SERVER_SHUTDOWN -> "Server Shutdown - Server is not available"; + case UNKNOWN -> "Unknown - Unspecified disconnection cause"; + }; + } + + /** + * Get the current disconnection type (for debugging/logging) + */ + public static DisconnectionType getCurrentDisconnectionType() { + return lastDisconnectionType; + } private static final Map, List>> listeners = new ConcurrentHashMap<>(); @@ -90,9 +125,8 @@ public class ClientHandler extends SimpleChannelInboundHandler 60000) { + lastDisconnectionType = DisconnectionType.TIMEOUT; + log.info("Channel inactive - server stopped responding to pings"); + } else { + lastDisconnectionType = DisconnectionType.CONNECTION_LOST; + log.info("Channel inactive - abrupt connection loss"); + } + } + + // Show appropriate dialog based on disconnection type - this forces restart + showDisconnectionDialogFinal(lastDisconnectionType); // Add a small delay to ensure dialog shows before channel cleanup try { @@ -171,75 +246,33 @@ public class ClientHandler extends SimpleChannelInboundHandler { - String message = """ - Phát hiện vấn đề kết nối mạng! - - Tình trạng: - • Mạng internet chậm hoặc không ổn định - • Một số yêu cầu có thể bị trễ hoặc thất bại - • Ứng dụng sẽ tiếp tục hoạt động nhưng có thể chậm - - Nguyên nhân có thể: - 1. Kết nối WiFi/Internet không ổn định - 2. Tốc độ mạng chậm - 3. Gián đoạn mạng tạm thời - - Giải pháp: - 1. Kiểm tra kết nối internet/WiFi - 2. Thử thao tác lại nếu có lỗi - 3. Đợi mạng ổn định hơn - 4. Khởi động lại ứng dụng nếu cần thiết - - Ứng dụng sẽ tiếp tục hoạt động... - """; - - int option = JOptionPane.showOptionDialog( - null, - message, - "Cảnh Báo - Vấn Đề Mạng", - JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - new String[]{"Tiếp Tục", "Đóng Ứng Dụng"}, - "Tiếp Tục" - ); - - if (option == 1) { // User chose to close application - System.exit(0); - } - - // Reset the flag after some time to allow showing the dialog again if needed - new Thread(() -> { - try { - Thread.sleep(NETWORK_ISSUE_DIALOG_COOLDOWN); - internetIssueDialogShown = false; - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - }).start(); - }); + // Removed showInternetIssueDialog - consolidated into single dialog system + + + + // Removed showConnectionLostDialog - consolidated into single dialog system + + private void resetConnectionState() { + lastDisconnectionType = DisconnectionType.UNKNOWN; + wasTimeoutDetected = false; + awaitingPong = false; + lastPingTime = 0; + lastPongTime = 0; } - private void showInternetIssueDialogBlocking() { - long currentTime = System.currentTimeMillis(); - + /** + * Shows final disconnection dialog that forces application restart + */ + private void showDisconnectionDialogFinal(DisconnectionType type) { // Only show dialog if cooldown period has passed to avoid spam + long currentTime = System.currentTimeMillis(); if ((internetIssueDialogShown && (currentTime - lastNetworkIssueTime) < NETWORK_ISSUE_DIALOG_COOLDOWN) || dialogCurrentlyShowing) { + // If dialog already shown recently, just exit + System.exit(0); return; } @@ -247,102 +280,145 @@ public class ClientHandler extends SimpleChannelInboundHandler showFinalDisconnectionDialog(type)); } } catch (InterruptedException | InvocationTargetException e) { - dialogCurrentlyShowing = false; - System.err.println("Error showing dialog: " + e.getMessage()); - // Show a simple message as fallback - System.err.println("NETWORK ISSUE DETECTED - Please restart the application"); + System.err.println("Error showing disconnection dialog: " + e.getMessage()); } - dialogCurrentlyShowing = false; - - // Reset the flag after some time to allow showing the dialog again if needed - new Thread(() -> { - try { - Thread.sleep(NETWORK_ISSUE_DIALOG_COOLDOWN); - internetIssueDialogShown = false; - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - }, "NetworkDialogReset").start(); + // Always exit after showing dialog + System.exit(0); } - private void showNetworkIssueDialog() { - String message = """ - Phát hiện vấn đề kết nối mạng! - - Tình trạng: - • Mạng internet chậm hoặc không ổn định - • Một số yêu cầu có thể bị trễ hoặc thất bại - • Ứng dụng sẽ tiếp tục hoạt động nhưng có thể chậm - - Nguyên nhân có thể: - 1. Kết nối WiFi/Internet không ổn định - 2. Tốc độ mạng chậm - 3. Gián đoạn mạng tạm thời - - Giải pháp: - 1. Kiểm tra kết nối internet/WiFi - 2. Thử thao tác lại nếu có lỗi - 3. Đợi mạng ổn định hơn - 4. Khởi động lại ứng dụng nếu cần thiết - - Ứng dụng sẽ tiếp tục hoạt động... - """; + private void showFinalDisconnectionDialog(DisconnectionType type) { + String title; + String message; - int option = JOptionPane.showOptionDialog( + switch (type) { + case TIMEOUT -> { + title = "Cảnh Báo - Hết Thời Gian Chờ"; + message = """ + Máy chủ không phản hồi! + + Tình trạng: + • Máy chủ đã dừng phản hồi các yêu cầu + • Kết nối vẫn còn nhưng không có dữ liệu + • Có thể do máy chủ quá tải hoặc đã treo + + Nguyên nhân có thể: + 1. Máy chủ đang gặp sự cố hoặc quá tải + 2. Mạng chậm gây ra timeout + 3. Máy chủ đã dừng hoạt động + + Giải pháp: + 1. Kiểm tra kết nối internet + 2. Liên hệ quản trị viên máy chủ + 3. Thử lại sau vài phút + + Ứng dụng sẽ đóng để đảm bảo tính toàn vẹn dữ liệu. + """; + } + case CONNECTION_LOST -> { + title = "Cảnh Báo - Mất Kết Nối"; + message = """ + Mất kết nối với máy chủ! + + Tình trạng: + • Kết nối bị ngắt đột ngột + • Không thể giao tiếp với máy chủ + + Nguyên nhân có thể: + 1. Mạng internet bị ngắt kết nối + 2. WiFi bị mất kết nối + 3. Cáp mạng bị rút + 4. Router/modem gặp sự cố + + Giải pháp: + 1. Kiểm tra kết nối internet/WiFi + 2. Kiểm tra cáp mạng + 3. Khởi động lại router nếu cần + 4. Khởi động lại ứng dụng + + Ứng dụng sẽ đóng để đảm bảo tính toàn vẹn dữ liệu. + """; + } + case NETWORK_ERROR -> { + title = "Cảnh Báo - Lỗi Mạng"; + message = """ + Phát hiện lỗi mạng! + + Tình trạng: + • Gặp lỗi trong quá trình truyền dữ liệu + • Kết nối không ổn định + + Nguyên nhân có thể: + 1. Mạng không ổn định + 2. Gói tin bị mất + 3. Sự cố mạng tạm thời + + Giải pháp: + 1. Kiểm tra chất lượng mạng + 2. Thử kết nối mạng khác + 3. Đợi mạng ổn định hơn + 4. Khởi động lại ứng dụng + + Ứng dụng sẽ đóng để đảm bảo tính toàn vẹn dữ liệu. + """; + } + case SERVER_SHUTDOWN -> { + title = "Cảnh Báo - Máy Chủ Ngừng Hoạt Động"; + message = """ + Máy chủ đã ngừng hoạt động! + + Tình trạng: + • Không thể kết nối đến máy chủ + • Máy chủ có thể đã tắt hoặc khởi động lại + + Nguyên nhân có thể: + 1. Máy chủ đang bảo trì + 2. Máy chủ gặp sự cố + 3. Máy chủ đã tắt + + Giải pháp: + 1. Liên hệ quản trị viên máy chủ + 2. Đợi máy chủ hoạt động trở lại + 3. Kiểm tra thông báo bảo trì + + Ứng dụng sẽ đóng để bảo vệ dữ liệu. + """; + } + default -> { + title = "Cảnh Báo - Mất Kết Nối"; + message = """ + Mất kết nối với máy chủ! + + Nguyên nhân không xác định. + + Giải pháp: + 1. Kiểm tra kết nối internet + 2. Khởi động lại ứng dụng + 3. Liên hệ hỗ trợ kỹ thuật + + Ứng dụng sẽ đóng để đảm bảo an toàn dữ liệu. + """; + } + } + + // Only show OK button - no continue option + JOptionPane.showMessageDialog( null, message, - "Cảnh Báo - Vấn Đề Mạng", - JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - new String[]{"Tiếp Tục", "Đóng Ứng Dụng"}, - "Tiếp Tục" + title, + JOptionPane.ERROR_MESSAGE ); - - if (option == 1) { // User chose to close application - System.exit(0); - } - } - - private void showConnectionLostDialog() { - SwingUtilities.invokeLater(() -> { - String message = """ - Mất kết nối với máy chủ! - - Nguyên nhân có thể: - 1. Mạng internet bị ngắt kết nối - 2. WiFi bị mất kết nối - 3. Máy chủ đã ngừng hoạt động - 4. Lỗi mạng tạm thời - - Giải pháp: - 1. Kiểm tra kết nối internet/WiFi - 2. Khởi động lại ứng dụng - 3. Liên hệ quản trị viên nếu vấn đề tiếp tục - - Ứng dụng sẽ đóng sau khi nhấn OK. - """; - - JOptionPane.showMessageDialog( - null, - message, - "Cảnh Báo - Mất Kết Nối", - JOptionPane.WARNING_MESSAGE - ); - }); } + + // Removed old dialog methods - now using single showDisconnectionDialogFinal @SuppressWarnings("unchecked") private void notifyListener(ResponseListener listener, T response) {