/
ledart
/
RRP_LedNik
Обзор
Документация
Войти
/
ledart
/
RRP_LedNik
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
client/Network.java
186 строк
7 KB
Darya
обновлены комментарии
18 дек 2025, 14:46
18 дек 2025, 14:46
95c0a7f
Код
Авторство
О чём код?
package client; import client.UI.GameField; import client.UI.GameField.SnakeState; import java.io.*; import java.net.Socket; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.function.Consumer; public class Network { private Socket socket; private BufferedReader in; private PrintWriter out; private GameField gameField; private Consumer<String> onMessageCallback; private volatile boolean connected = false; private Thread listenThread; private String currentScreen = "LOGIN"; public void setGameField(GameField field) { this.gameField = field; } public void setOnMessageCallback(Consumer<String> callback) { this.onMessageCallback = callback; } public void setCurrentScreen(String screen) { this.currentScreen = screen; System.out.println("[Network] Screen changed to: " + screen); } public void connect(String host, int port) { try { socket = new Socket(host, port); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(socket.getOutputStream(), true); connected = true; listenThread = new Thread(this::listen, "Network-Listener"); listenThread.start(); System.out.println("[Client] Connected to server at " + host + ":" + port); } catch (IOException e) { System.err.println("[Client] Connection failed: " + e.getMessage()); e.printStackTrace(); } } public void disconnect() { connected = false; try { if (out != null) { sendMessage("DISCONNECT"); } if (listenThread != null && listenThread.isAlive()) { listenThread.interrupt(); } if (socket != null && !socket.isClosed()) { socket.close(); } System.out.println("[Client] Disconnected from server"); } catch (IOException e) { System.err.println("[Client] Error during disconnect: " + e.getMessage()); } } public void sendMessage(String msg) { if (out != null && connected) { out.println(msg); System.out.println("[Client] Sent: " + msg); } else { System.err.println("[Client] Cannot send message, not connected: " + msg); } } private void listen() { try { String message; while (connected && (message = in.readLine()) != null) { System.out.println("[Client] Received: " + message); // Фильтрация сообщений по экрану boolean shouldProcess = true; if (currentScreen.equals("LOBBY")) { // В лобби фильтруем только игровые сообщения if (message.startsWith("GAME_STATE:") || message.startsWith("COUNTDOWN:") || message.equals("GAME_START") || message.startsWith("PLAYER_DEAD:") || message.equals("GAME_OVER") || message.equals("GAME_STOPPED") || message.startsWith("SCORES:")) { shouldProcess = false; System.out.println("[Network] Filtered game message in LOBBY: " + message); } } else if (currentScreen.equals("ROOM")) { // В комнате фильтруем только лобби-сообщения if (message.startsWith("NEW_ROOM:") || message.startsWith("ROOM_REMOVED:") || message.equals("REFRESH_COMPLETE")) { shouldProcess = false; System.out.println("[Network] Filtered lobby message in ROOM: " + message); } } else if (currentScreen.equals("LEADERBOARD")) { // В лидерборде фильтруем всё кроме таблицы и ошибок if (!message.startsWith("TOP_SCORES") && !message.startsWith("ERROR:") && !message.equals("CONNECTION_LOST")) { shouldProcess = false; System.out.println("[Network] Filtered non-leaderboard message: " + message); } } else if (currentScreen.equals("LOGIN")) { // На экране логина пропускаем ЛОГИН, РЕГИСТРАЦИЮ и ошибки if (!message.equals("LOGIN_OK") && !message.startsWith("LOGIN_OK:") && !message.equals("REGISTER_OK") && !message.startsWith("ERROR:") && !message.equals("CONNECTION_LOST")) { shouldProcess = false; System.out.println("[Network] Filtered non-login message in LOGIN: " + message); } } if (shouldProcess && onMessageCallback != null) { onMessageCallback.accept(message); } if (message.startsWith("GAME_STATE:") && gameField != null) { Map<String, SnakeState> state = parseGameState(message); gameField.updateState(state); } if (message.startsWith("ERROR:")) { System.err.println("[Client] Server error: " + message); } } } catch (IOException e) { if (connected) { System.err.println("[Client] Connection lost: " + e.getMessage()); if (onMessageCallback != null) { onMessageCallback.accept("CONNECTION_LOST"); } } } finally { connected = false; } } private Map<String, SnakeState> parseGameState(String message) { Map<String, SnakeState> map = new HashMap<>(); try { String data = message.substring("GAME_STATE:".length()); String[] snakes = data.split(";"); for (String s : snakes) { String[] parts = s.split(":"); if (parts.length < 2) continue; String name = parts[0]; String[] posArr = parts[1].split("\\|"); LinkedList<int[]> positions = new LinkedList<>(); for (String p : posArr) { String[] xy = p.split(","); if (xy.length >= 2) { positions.add(new int[]{ Integer.parseInt(xy[0]), Integer.parseInt(xy[1]) }); } } map.put(name, new SnakeState(positions, new int[]{0, 1})); } } catch (Exception e) { System.err.println("[Client] Error parsing game state: " + e.getMessage()); } return map; } public boolean isConnected() { return connected; } }