Документация на английском языке: README.en.md.
Network Chat — это Java 21 приложение для сетевого чата поверх TCP сокетов:
- сервер с handshake и рассылкой сообщений;
- консольный клиент;
- бот-клиент с командами времени/даты;
- GUI клиент на Swing со встроенной панелью подключения, retry/cancel, сохранением последних настроек, локальной лентой сообщений, комнатами, приватными сообщениями и разделением на MVC;
- опциональная файловая история сообщений с replay последних сообщений комнаты после рестарта;
- опциональный TLS-режим, token-based accounts с ролями
USER/ADMINи admin-команда/health; - Windows release zip с launch scripts, checksums и provenance metadata;
- воспроизводимая Gradle-сборка, тесты, CI и проверки качества.
./gradlew runServer --args="--port 1500"
./gradlew runClient
./gradlew runBotClient
./gradlew runGuiClientСервер по умолчанию слушает порт 1500. Для программного запуска используйте
ChatServerConfig: он задаёт порт, максимальное число клиентов, timeout handshake и timeout чтения
после handshake.
Чтобы включить файловую историю:
./gradlew runServer --args="--port 1500 --history build/chat-history.jsonl"Чтобы включить accounts, сначала создайте строку для accounts.csv:
./gradlew createAccount --args="alice USER secret" >> build/accounts.csv
./gradlew createAccount --args="admin ADMIN admin-secret" >> build/accounts.csv
./gradlew runServer --args="--port 1500 --accounts build/accounts.csv"Клиенты передают token через GUI-поле Токен или переменную окружения NETWORK_CHAT_TOKEN.
Admin-пользователь может отправить /health и получить приватный ответ со статусом сервера.
Чтобы включить TLS, серверу нужен Java keystore:
keytool -genkeypair -alias network-chat -keyalg RSA -keysize 3072 -validity 365 \
-keystore build/network-chat.p12 -storetype PKCS12 -storepass changeit
./gradlew runServer --args="--port 1500 --tls-keystore build/network-chat.p12 --tls-password changeit"Клиент включает TLS через окружение:
$env:NETWORK_CHAT_TLS="true"
$env:NETWORK_CHAT_TRUSTSTORE="build/network-chat.p12"
$env:NETWORK_CHAT_TRUSTSTORE_PASSWORD="changeit"
./gradlew runGuiClientРелизный набор без Gradle на машине пользователя собирается командой:
./gradlew releaseBundleАртефакты появятся в build/release: Windows zip, checksums.txt и provenance.json.
Краткий архитектурный контракт описан в docs/architecture.md.
ChatServerпринимает TCP-соединения и обрабатывает клиентов в bounded executor.ChatConnectionчитает и пишет однострочные UTF-8 JSON frames.ChatProtocolсериализуетChatMessage.ChatMessageсодержитprotocolVersion; unversioned клиенты получают явныйERROR.- Для
TEXTсообщенийdataсодержит только исходный текст, аsenderсодержит автора. TEXTсообщения рассылаются всем клиентам, включая отправителя, чтобы пользователь видел своё сообщение в ленте.ROOM_TEXTдоставляется только участникам комнаты;PRIVATE_TEXTдоставляется отправителю и адресату.- GUI хранит локальную ленту текущей сессии, оформляет
USER_ADDED/USER_REMOVEDкак service events, используетmessageIdдля дедупликации, поддерживает поиск по тексту, автору, дате/timestamp, комнате, адресату и экспорт JSON/CSV. - При включённой истории сервер сохраняет
ROOM_TEXT/PRIVATE_TEXTв JSONL, ограничивает размер истории, мигрирует старые unversionedTEXTзаписи и отправляет последние сообщения комнаты при входе. - При включённых accounts сервер принимает только
USER_NAMEс корректным token; роли используются для admin-команд. - TLS включается конфигурацией сервера и переменными окружения клиента.
- Console и Swing клиенты сами форматируют отображение вида
alice: hello. - Bot client отвечает на команды времени/даты по
data, используя автора изsender.
./gradlew test./gradlew integrationTest./gradlew uiTest./gradlew check./gradlew jacocoAllReport./gradlew jacocoTestCoverageVerification
В CI HTML-отчёт JaCoCo публикуется как artifact, а line/branch coverage добавляется в GitHub Actions Summary для Linux job.
- Unit-тесты (
src/test/java) — протокол, bot-команды, модель GUI. - Интеграционные тесты (
src/integrationTest/java) — подключение клиентов, handshake, лимиты сервера, timeout и обмен сообщениями. - UI smoke тесты (
src/uiTest/java) — проверка отрисовки состояния окна чата. - План развития — больше негативных сценариев протокола и проверок отказоустойчивости медленных клиентов.
Для оценки покрытия используется JaCoCo: в CI порог для ядра (network + protocol) — 70%/65% (line/branch).
Address already in use: запустите сервер на другом порту, например./gradlew runServer --args="--port 1600".- GUI не показывает окно в CI: UI smoke тесты автоматически пропускаются в headless окружении.
- Клиент сразу отключился: проверьте уникальность имени и длину ника (
3..64, буквы, цифры,_,-). - Клиент получил
Server is busy: достигнутmaxClientsизChatServerConfig. - GUI показывает
Нет соединения: проверьте адрес/порт и используйте кнопкуПовторить; последние введённые настройки сохраняются локально. - Повреждённая строка в history-файле пропускается при старте; валидная история продолжает загружаться.
Authentication failed: проверьте строку пользователя вaccounts.csvи token в GUI илиNETWORK_CHAT_TOKEN.- Ошибка TLS trust: укажите truststore клиента через
NETWORK_CHAT_TRUSTSTOREили используйте сертификат, которому доверяет JVM.
src/main/java— код приложения.src/test/java— unit-тесты.src/integrationTest/java— интеграционные тесты.src/uiTest/java— smoke тесты UI.docs— архитектурные заметки и визуальные материалы..github/workflows— CI и проверки безопасности.
- CI на Linux и Windows.
- Авто-проверки: Checkstyle, Spotless, SpotBugs, JaCoCo.
- Security проверки: CodeQL и OpenSSF Scorecard.
- Dependabot с группировкой обновлений зависимостей и Actions.
- Явно оформленные файлы
CONTRIBUTING.mdиSECURITY.md.
- v1.6.x: TLS, token accounts, release packaging и security hardening реализованы в текущей линии.
- Позже: персистентные профили пользователей и расширенное администрирование отдельными функциональными этапами.