Skip to content

Latest commit

 

History

History
155 lines (103 loc) · 6.08 KB

File metadata and controls

155 lines (103 loc) · 6.08 KB

Simple Chat

Простой многопользовательский консольный чат на Rust с использованием WebSocket протокола. Проект состоит из сервера и клиента, поддерживает множество комнат и одновременных подключений.

Особенности

  • WebSocket соединение - асинхронная связь между клиентом и сервером
  • Комнаты - поддержка множества чат-комнат по ID
  • Многопользовательский режим - одновременная работа нескольких клиентов
  • Система никнеймов - каждый пользователь выбирает себе имя
  • Уведомления - автоматическое оповещение о подключении/отключении пользователей
  • Временные метки - каждое сообщение содержит дату и время отправки
  • Корректное завершение - поддержка команды /quit для выхода из чата

Технологии

  • Rust - основной язык программирования
  • Tokio - асинхронный runtime
  • tokio-tungstenite - WebSocket библиотека
  • futures-util - утилиты для работы с асинхронными стримами
  • chrono - работа с датой и временем
  • rustls/ring - криптографический провайдер для WebSocket

Требования

  • Rust (последняя стабильная версия)
  • Cargo (поставляется с Rust)

Установка и запуск

Сервер

  1. Клонируйте репозиторий:
git clone https://github.com/Aarende/simple_chat
  1. Перейдя в директорию сервера создайте .env файл
PORT=8080

Клиент

  1. Запустите сервер
cargo run --release
  1. В отдельном терминале перейдите в директорию клиента и создайте .env файл
CHAT_SERVER_URL=ws://localhost:8080
  1. Запустите клиент
cargo run --release

Использование

Подключение к чату

  1. При запуске клиента введите ваш никнейм

  2. Введите ID комнаты (целое положительное число)

  3. При успешном подключении вы увидите приветственное сообщение

Отправка сообщений

  • Просто введите текст и нажмите 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!

Возможные проблемы и решения

  1. Ошибка подключения к серверу

    • Убедитесь, что сервер запущен
    • Проверьте правильность URL в .env файле клиента
    • Проверьте доступность порта
  2. Ошибка "address already in use"

    • Измените порт сервера через переменную окружения PORT
  3. WebSocket handshake ошибка

    • Убедитесь, что используете ws:// для обычного соединения (или wss:// для защищённого)

Вклад в проект

Приветствуются pull request'ы. Для крупных изменений, пожалуйста, сначала откройте issue для обсуждения.