MyManager — это Java-приложение для отслеживания рабочего времени с поддержкой распределённой архитектуры на основе UDP-коммуникации.
Проект представляет собой систему управления рабочим временем, которая позволяет:
- Отслеживать рабочий день — фиксировать начало и конец рабочего периода
- Регистрировать перерывы — автоматически учитывать время обеда
- Вычислять итоги — получать общее отработанное время за день
- Обмениваться командами — взаимодействовать через сетевые сообщения (UDP)
- Перенаправлять пакеты — система автоматически перенаправляет сообщения, предназначенные другим адресатам
-
Subscriber— слушатель входящих UDP-пакетов- Использует
pcap4jдля захвата сетевых пакетов на уровне ОС - Фильтрует пакеты по портам
- Перенаправляет чужие сообщения
- Сохраняет входящие сообщения в очередь
- Использует
-
Publisher— отправитель UDP-пакетов- Создаёт UDP-сокет
- Отправляет сериализованные сообщения
-
Message— модель сообщения с встроенной сериализацией- Поля:
sender,receiver,data - Формат:
{length}:{receiver}:{data}:{sender} - Использует паттерн
Builderдля удобного создания
- Поля:
-
WorkDay— управляет состоянием рабочего дня- Отслеживает работу (start → end)
- Управляет обедом (start → end)
- Вычисляет итоговое время работы
- Имеет 4 статуса: не начат (0), работает (1), обед (2), завершён (3)
-
WorkTime— представляет интервал времени- Фиксирует стартовое и финальное время
- Вычисляет продолжительность периода
-
TimeProcessor— утилита для расчётов времени- Вычисляет разницу между временами
- Агрегирует несколько временных интервалов
-
Handler— абстрактный класс для обработки сообщений- Запускает отдельный поток для прослушивания сообщений
- Десериализует входящие команды
- Вызывает
executeCommand()при получении новых сообщений
-
TimeTrackerHandler— конкретная реализация- Обрабатывает команды:
startWork,endWork,startDinner,endDinner,getTime,getStatus,newDay,STOP - Управляет жизненным циклом
WorkDay - Сохраняет данные в БД (TODO)
- Обрабатывает команды:
-
Configurator— загружает конфигурацию из файла- Читает IP и PORT из
config.properties
- Читает IP и PORT из
GUI— командный интерфейсstartSimpleGUI()— локальный режим (прямое управлениеWorkDay)startRemoteGUI()— удалённый режим (отправка команд через UDP)
Main
↓
1. Инициализация логирования (Log4j)
↓
2. Запуск Subscriber (слушатель UDP-пакетов)
↓
3. Создание TimeTrackerHandler
↓
4. Handler.process() → запуск отдельного потока обработки сообщений
↓
5. GUI.startRemoteGUI() → интерактивное меню в консоли
↓
Пользователь выбирает действие → GUI создаёт Message → Publisher отправляет
↓
Subscriber получает сообщение → Handler.executeCommand() → WorkDay.metod()
↓
Результат выводится в консоль
| Команда | Действие |
|---|---|
startWork |
Начать рабочий день |
endWork |
Завершить рабочий день |
startDinner |
Начать перерыв на обед |
endDinner |
Завершить обед |
getTime |
Получить отработанное время за день |
getStatus |
Получить текущий статус |
newDay |
Начать новый день (сохранить текущий) |
STOP |
Остановить сервис |
| Зависимость | Версия | Назначение |
|---|---|---|
| JDK | 17 | Язык программирования |
| Lombok | 1.18.30 | Генерация getter'ов, логирования |
| SLF4J | 1.7.30 | Фасад для логирования |
| Log4j | 1.2.17 | Реализация логирования |
| pcap4j | 1.8.2 | Захват и обработка сетевых пакетов |
| JUnit Jupiter | 5.11.4 | Фреймворк для тестирования |
- Windows (проект использует пути
C:\Windows\System32\Npcap) - Установленный Npcap (или WinPcap)
PORT=12345
IP=127.0.0.1Путь: src/main/resources/config.properties
Пример конфигурации логирования находится в: src/main/resources/log4j.properties
- Java 17+
- Maven
- Npcap (для захвата пакетов)
mvn clean packagejava -cp target/MyManager-1.0-SNAPSHOT.jar ru.proj3ct5.Main0 - Выход
1 - Начать РД
2 - Закончить РД
3 - Начать обед
4 - Закончить обед
5 - Время
-----------------------------
> 1
Работа начата!
> 3
Обед начат!
> 4
Обед завершён!
> 2
Работа завершена!
Отработано: 08:30:00
> 0
Выход
0 - Выход
1 - Начать РД
2 - Закончить РД
3 - Начать обед
4 - Закончить обед
5 - Время
6 - Новый день
-----------------------------
> 1
Message sent successfully
> 5
Message sent successfully
# На сервере отрабатывает команда getTime
# Результат выводится в консоль сервера
> 0
Message sent successfully
Service TimeTracker stopped
- Многопоточность — каждый компонент работает в отдельном потоке
- Сериализованные сообщения — безопасный обмен данными
- Автоматическое перенаправление — система перенаправляет пакеты, не предназначенные для себя
- Асинхронная обработка — команды обрабатываются в фоновом потоке
- Синхронизированный доступ — использование
synchronizedдля безопасности потоков