Простой многопользовательский консольный чат на Rust с использованием WebSocket протокола. Проект состоит из сервера и клиента, поддерживает множество комнат и одновременных подключений.
- WebSocket соединение - асинхронная связь между клиентом и сервером
- Комнаты - поддержка множества чат-комнат по ID
- Многопользовательский режим - одновременная работа нескольких клиентов
- Система никнеймов - каждый пользователь выбирает себе имя
- Уведомления - автоматическое оповещение о подключении/отключении пользователей
- Временные метки - каждое сообщение содержит дату и время отправки
- Корректное завершение - поддержка команды
/quitдля выхода из чата
- Rust - основной язык программирования
- Tokio - асинхронный runtime
- tokio-tungstenite - WebSocket библиотека
- futures-util - утилиты для работы с асинхронными стримами
- chrono - работа с датой и временем
- rustls/ring - криптографический провайдер для WebSocket
- Rust (последняя стабильная версия)
- Cargo (поставляется с Rust)
- Клонируйте репозиторий:
git clone https://github.com/Aarende/simple_chat
- Перейдя в директорию сервера создайте .env файл
PORT=8080
- Запустите сервер
cargo run --release- В отдельном терминале перейдите в директорию клиента и создайте .env файл
CHAT_SERVER_URL=ws://localhost:8080
- Запустите клиент
cargo run --release-
При запуске клиента введите ваш никнейм
-
Введите ID комнаты (целое положительное число)
-
При успешном подключении вы увидите приветственное сообщение
- Просто введите текст и нажмите Enter - сообщение отправится в чат
- Сообщения видны всем участникам комнаты
- Введите команду
/quitдля выхода из чата - Клиент корректно закроет соединение
simple_chat/
├── chat_server/
│ ├── src/
│ │ ├── main.rs # Точка входа сервера
│ │ └── chat_utils/ # Утилиты для работы с чатом
│ │ ├── mod.rs # Определение типов WebSocket
│ │ ├── chat.rs # Основная логика чата
│ │ ├── room.rs # Комнаты и broadcast каналы
│ │ └── user.rs # Обработка пользовательских соединений
│ └── Cargo.toml
└── chat_client/
├── src/
│ └── main.rs # Точка входа клиента
└── Cargo.toml
- Chat - главная структура, управляющая комнатами
- Room - представляет отдельную чат-комнату с broadcast каналом
- UserReceiver - обрабатывает входящие сообщения от пользователя
- UserSender - отправляет сообщения пользователю
- Асинхронное чтение ввода с консоли
- WebSocket соединение с сервером
- Две параллельные задачи: чтение сообщений с сервера и отправка сообщений на сервер
🔗 Подключение к ws://localhost:8080
✅ Подключено к серверу!
👤 Ваш никнейм: Alice
🏠 ID комнаты: 1
📝 Подключение успешно, добро пожаловать в чат! Введите /quit для выхода:
[2026-04-07 14:30:25] Server: Alice подключился к чату!
[2026-04-07 14:30:30] Alice: Привет всем!
[2026-04-07 14:30:35] Bob: Привет, Alice!
-
Ошибка подключения к серверу
- Убедитесь, что сервер запущен
- Проверьте правильность URL в
.envфайле клиента - Проверьте доступность порта
-
Ошибка "address already in use"
- Измените порт сервера через переменную окружения
PORT
- Измените порт сервера через переменную окружения
-
WebSocket handshake ошибка
- Убедитесь, что используете
ws://для обычного соединения (илиwss://для защищённого)
- Убедитесь, что используете
Приветствуются pull request'ы. Для крупных изменений, пожалуйста, сначала откройте issue для обсуждения.