Skip to content

Repin-Daniil/chat-server

Repository files navigation

Chat server

Сервер многопользовательского TCP-чата на фреймворке userver

  • Каждый пользователь может одновременно поддерживать личную коммуникацию с несколькими собеседниками.
  • Для подтверждения личности собеседников реализована аутентификация пользователей по логину/паролю

Особенности реализации

  • userver позволяет обрабатывать сообщения асинхронно и параллельно. У каждого пользователя при подключении появляется своя lock-free очередь, в которую собеседники будут отправлять сообщения . Так как чат многопользовательский выбрана NonFifoMpscQueue — сообщения от одного адресата приходят хронологически упорядоченно, от нескольких — не гарантируется.
  • Один указатель на очередь передается в обработчик сокета, второй сохраняется в реестре онлайн-пользователей (RcuMap). Это позволяет при разрыве TCP-соединения и переподключении доставить сообщения, отправленные клиенту за время его отсутствия
  • Аутентификация проходит по логин/паролю через HTTP. В случае успеха клиенту выдается токен, через который в дальнейшем его TCP-соединение будет идентифицировано
  • Пароли пользователей хранятся в PostrgreSQL в захешированном виде с солью, чтобы в случае утечки нельзя было подобрать его по «радужным таблицам»

Запуск

  1. Запустить сервис

    make docker-start-service-release
  2. Получить токены Отправить POST-запрос на ручку v1/auth порт 8080 с параметром name = логин и паролем в теле запроса. Можно воспользоваться дефолтными Alice — strong_password и Ivan — ivan_password. В ответе будет возвращен токен

  3. Подключиться к серверу

    nc localhost 8181
  4. Идентифицировать себя, отправив <логин>@<токен>\r\n\r\n Каждое сообщение должно оканчиваться \r\n\r\n. Если все сделано правильно — сервер вернет Server@OK

  5. Когда оба подключены, можно отправлять сообщения такого формата: <логин получателя>@<сообщение>\r\n\r\n. Можно обратить внимание, что в процессе передачи сервер заменит логин получателя на логин отправителя

Пример общения

img.png

Архитектура

  • Chat — фасад, скрывающий для ручек внутреннее устройство системы
  • UserRegistry — реестр онлайн пользователей, хранящий в RcuMap указатели на очереди сообщений
  • AuthManager — отвечает за аутентификацию по паролю и выпуск токенов

Описание для makefile располагаются в файле

About

Многопользовательский TCP-чат на userver

Topics

Resources

Stars

Watchers

Forks

Contributors 2

  •  
  •