diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index 2bfbbd0..409263e 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -14,5 +14,17 @@ $ProjectFileDir$ + + postgresql + true + org.postgresql.Driver + jdbc:postgresql://localhost:5432/postgres + + + + + + $ProjectFileDir$ + \ No newline at end of file diff --git a/Client/pom.xml b/Client/pom.xml index e7ad365..d00cd2a 100644 --- a/Client/pom.xml +++ b/Client/pom.xml @@ -17,4 +17,17 @@ UTF-8 + + + org.openjfx + javafx-controls + 23.0.2 + + + org.openjfx + javafx-base + 23.0.2 + + + \ No newline at end of file diff --git a/Client/src/main/java/ru/project/ChatClientGUI.java b/Client/src/main/java/ru/project/ChatClientGUI.java index 2f31496..37d5a53 100644 --- a/Client/src/main/java/ru/project/ChatClientGUI.java +++ b/Client/src/main/java/ru/project/ChatClientGUI.java @@ -1,27 +1,115 @@ package ru.project; import javafx.application.Application; +import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.control.Button; +import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.layout.VBox; import javafx.stage.Stage; +import javafx.geometry.Insets; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; public class ChatClientGUI extends Application { + private TextArea chatArea; + private TextField inputField; + private Button sendButton; + private Socket socket; + private DataInputStream in; + private DataOutputStream out; + private boolean isBanned = false; @Override public void start(Stage primaryStage) { - TextField inputField = new TextField(); + chatArea = new TextArea(); + chatArea.setEditable(false); + chatArea.setWrapText(true); + + inputField = new TextField(); inputField.setPromptText("Введите сообщение..."); + Button sendButton = new Button("Отправить"); - VBox root = new VBox(10, inputField, sendButton); + sendButton.setOnAction(e -> sendMessage()); + + VBox root = new VBox(10,chatArea, inputField, sendButton); + root.setPadding(new Insets(10, 10, 10, 10)); Scene scene = new Scene(root, 400, 300); primaryStage.setTitle("Чат-клиент"); primaryStage.setScene(scene); primaryStage.show(); + + connectToServer(); } public static void main(String[] args) { launch(args); } + + private void sendMessage() { + String message = inputField.getText().trim(); + if (!message.isEmpty() && !isBanned) { + try { + out.writeUTF(message); // Отправляем на сервер + inputField.clear(); // Очищаем поле + } catch (IOException e) { + chatArea.appendText("Ошибка отправки сообщения\n"); + } + } else if (isBanned) { + chatArea.appendText("Вы не можете писать сообщения, так как заблокированы.\n"); + } + } + private void connectToServer() { + try { + socket = new Socket("localhost", 8189); + in = new DataInputStream(socket.getInputStream()); + out = new DataOutputStream(socket.getOutputStream()); + chatArea.appendText("Подключено к серверу\n"); + + new Thread(() -> { + try { + while (true) { + String message = in.readUTF(); + Platform.runLater(() -> processServerMessage(message)); + } + } catch (Exception e) { + Platform.runLater(() -> chatArea.appendText(e.getMessage() + "\n")); + } + }).start(); + } catch (Exception e) { + chatArea.appendText(e.getMessage() + "\n"); + } + } + private void processServerMessage(String message) { + if (message.startsWith("/")) { + if (message.equalsIgnoreCase("/exitok")) { + disconnect(); + } else if (message.startsWith("/authOK ")) { + chatArea.appendText("Авторизация успешна! Ваш ник: " + message.split(" ")[1] + "\n"); + } else if (message.startsWith("/regOK ")) { + chatArea.appendText("Регистрация успешна! Ваш ник: " + message.split(" ")[1] + "\n"); + } else if (message.equalsIgnoreCase("/banok")) { + isBanned = true; + chatArea.appendText("Вы были заблокированы администратором.\n"); + } else if (message.equalsIgnoreCase("/unbanok")) { + isBanned = false; + chatArea.appendText("Вы теперь разбанены и можете писать сообщения.\n"); + } + } else { + chatArea.appendText(message + "\n"); // Обычное сообщение + } + } + private void disconnect() { + try { + if (socket != null) socket.close(); + if (in != null) in.close(); + if (out != null) out.close(); + chatArea.appendText("Отключено от сервера\n"); + } catch (IOException e) { + e.printStackTrace(); + } + } } diff --git a/Server/src/main/java/ru/project/Server.java b/Server/src/main/java/ru/project/Server.java index 40a4f29..d490365 100644 --- a/Server/src/main/java/ru/project/Server.java +++ b/Server/src/main/java/ru/project/Server.java @@ -42,11 +42,14 @@ public void start(){ public void subscribe(ClientHandler clientHandler){ clients.add(clientHandler); + broadcastMessage("В чат зашел: " + clientHandler.getUsername()); + System.out.println("[SERVER] Пользователь " + clientHandler.getUsername() + " подключился."); } public void unsubscribe(ClientHandler clientHandler){ clients.remove(clientHandler); broadcastMessage("Из чата вышел: "+ clientHandler.getUsername()); + System.out.println("[SERVER] Клиент " + clientHandler.getUsername() + " отключён."); } public void broadcastMessage(String message){ diff --git a/Server/src/main/java/ru/project/database/DatabaseManager.java b/Server/src/main/java/ru/project/database/DatabaseManager.java index a9bb845..51ad55c 100644 --- a/Server/src/main/java/ru/project/database/DatabaseManager.java +++ b/Server/src/main/java/ru/project/database/DatabaseManager.java @@ -4,7 +4,7 @@ import java.sql.*; public class DatabaseManager { - private static final String DB_URL = "jdbc:postgresql://localhost:5432/postgres?currentSchema=public&user=postgres&password=postgres"; + private static final String DB_URL = "jdbc:postgresql://localhost:5432/postgres?currentSchema=public&user=iakovlysenko&password=null"; public DatabaseManager() {