Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
4190e4f
init: реализация клиентской части
iakkov Dec 25, 2024
890f8a2
Отправка личных сообщений
iakkov Dec 25, 2024
37ffad1
Отправка личных сообщений
iakkov Dec 25, 2024
1a5a38b
Реализация логина
iakkov Dec 29, 2024
beb8412
Фикс авторизации
iakkov Dec 29, 2024
055f168
Реализация логина
iakkov Jan 6, 2025
e25a553
Доработка логина: переменная isLogged для контроля перехода в цикл ра…
iakkov Jan 6, 2025
c897542
Реализация регистрации в чате
iakkov Jan 6, 2025
8273247
Доработка регистрации
iakkov Jan 6, 2025
f9b12fb
Добавление админу функции кикать пользователей
iakkov Jan 6, 2025
8c3ae3b
Исправления в методе kickUser(String usernameToKick, ClientHandler ad…
iakkov Jan 7, 2025
1651808
Добавлена обработка ошибки IOException в ClientHandler, корректное за…
iakkov Jan 11, 2025
10b4360
Добавлена обработка ошибки SocketException в Client. Также циклы обра…
iakkov Jan 11, 2025
76ecfa5
Аутентификация и регистрация разными строками без парсинга
iakkov Jan 12, 2025
a1aafbe
Создан класс DatabaseManager
iakkov Jan 12, 2025
4712e33
Дополнения в DatabaseManager
iakkov Jan 12, 2025
75ca6a7
Добавление сходных методов как в классе inMemoryAuthenticator, а такж…
iakkov Jan 12, 2025
c57ec64
Настройка методов регистрации и аутентификации для работы с базой данных
iakkov Jan 12, 2025
c699787
Добавление DatabaseManager к серверу
iakkov Jan 12, 2025
c0d2c1d
Зависимости
iakkov Jan 12, 2025
81b140b
Добавление admin при создании таблицы
iakkov Jan 12, 2025
956d413
Проверка на admin, фикс
iakkov Jan 12, 2025
3f1f125
Углубленная проверка username
iakkov Jan 21, 2025
bd5fe36
Требования для имени пользователя, логина и пароля при регистраци. Ре…
iakkov Jan 21, 2025
c3a0e38
Добавление времени к сообщениям
iakkov Feb 13, 2025
a2dc166
Бан пользователя. Начало разработки
iakkov Feb 15, 2025
aad311f
Добавление времени к сообщениям
iakkov Feb 13, 2025
1a01030
Бан пользователя. Начало разработки
iakkov Feb 15, 2025
2e5142c
Доработка бана пользователя
iakkov Feb 16, 2025
002f4f4
Чистка кода
iakkov Feb 16, 2025
77a5cf3
Теперь можно разбанить
iakkov Feb 16, 2025
721d704
Merge branch 'version_1.5' into version_1.6
iakkov Feb 16, 2025
fb7970e
Проверка последней активности и иключение неактивных пользователей
iakkov Feb 18, 2025
496cdd6
Интерфейс
iakkov Feb 19, 2025
c48d6ba
Интерфейс: коррекция зависимостей
iakkov Feb 19, 2025
c1a1897
Интерфейс: вывод сообщений
iakkov Feb 19, 2025
2a61f8f
Интерфейс: подключение к серверу
iakkov Feb 19, 2025
78fd5f6
Интерфейс клиентской части
iakkov Feb 19, 2025
eb34b2d
Доработка серверной части: теперь сервер более детально видит подключ…
iakkov Feb 19, 2025
da16f53
Рабочий интерфейс клиента
iakkov Feb 19, 2025
949980b
Возможность создавать комнаты и присоединяться к ним
iakkov Feb 22, 2025
ceac01f
Релизная версия
iakkov Feb 22, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions .idea/dataSources.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions .idea/sqldialects.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions Client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,17 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>23.0.2</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>23.0.2</version>
</dependency>
</dependencies>

</project>
115 changes: 115 additions & 0 deletions Client/src/main/java/ru/project/ChatClientGUI.java
Original file line number Diff line number Diff line change
@@ -0,0 +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) {
chatArea = new TextArea();
chatArea.setEditable(false);
chatArea.setWrapText(true);

inputField = new TextField();
inputField.setPromptText("Введите сообщение...");

Button sendButton = new Button("Отправить");
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();
}
}
}
96 changes: 96 additions & 0 deletions Client/src/main/java/ru/project/Client.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package ru.project;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.util.Scanner;

public class Client {
private Socket socket;
private DataOutputStream out;
private DataInputStream in;
private Scanner scanner;
private boolean isBanned = false;

public Client() throws IOException {
scanner = new Scanner(System.in);
socket = new Socket("localhost", 8189);
out = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());

new Thread(() -> {
try {
while (!socket.isClosed()) {
String message = in.readUTF();
if (message.startsWith("/")) {
if (message.equalsIgnoreCase("/exitok")) {
break;
}
if (message.startsWith("/authOK ")) {
System.out.println("Авторизация прошла успешно! Имя пользователя: "
+ message.split(" ")[1]);
}
if (message.startsWith("/regOK ")) {
System.out.println("Регистрация прошла успешно! Имя пользователя: "
+ message.split(" ")[1]);
}
if (message.equalsIgnoreCase("/banok")) {
isBanned = true;
System.out.println("Вы были заблокированы администратором.");
}
if (message.equalsIgnoreCase("/unbanok")) {
isBanned = false;
System.out.println("Теперь вы не заблокированы. Вам доступна отправка сообщений в чат.");
}
} else {
System.out.println(message);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
disconnect();
}
}).start();

while (!socket.isClosed()) {
String message = scanner.nextLine();
try {
if (!isBanned) {
out.writeUTF(message);
} else System.out.println("Вы не можете писать сообщения.");
} catch (SocketException e) {
System.out.println("Вы были отключены от сервера.");
}
if (message.equalsIgnoreCase("/exit")) {
break;
}
}
}

public void disconnect() {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
14 changes: 14 additions & 0 deletions Client/src/main/java/ru/project/ClientApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package ru.project;

import java.io.IOException;


public class ClientApplication {
public static void main(String[] args) {
try {
new Client();
} catch (IOException e) {
e.printStackTrace();
}
}
}
7 changes: 7 additions & 0 deletions Server/src/main/java/ru/project/Authenticator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.project;

public interface Authenticator {
void initialize();
boolean authenticate(ClientHandler clientHandler, String login, String password);
boolean registration(ClientHandler clientHandler, String username, String login, String password);
}
Loading