Сервер многопользовательского TCP-чата на фреймворке userver
- Каждый пользователь может одновременно поддерживать личную коммуникацию с несколькими собеседниками.
- Для подтверждения личности собеседников реализована аутентификация пользователей по логину/паролю
- userver позволяет обрабатывать сообщения асинхронно и параллельно. У каждого пользователя при подключении появляется своя lock-free очередь, в которую собеседники будут отправлять сообщения . Так как чат многопользовательский выбрана NonFifoMpscQueue — сообщения от одного адресата приходят хронологически упорядоченно, от нескольких — не гарантируется.
- Один указатель на очередь передается в обработчик сокета, второй сохраняется в реестре онлайн-пользователей (RcuMap). Это позволяет при разрыве TCP-соединения и переподключении доставить сообщения, отправленные клиенту за время его отсутствия
- Аутентификация проходит по логин/паролю через HTTP. В случае успеха клиенту выдается токен, через который в дальнейшем его TCP-соединение будет идентифицировано
- Пароли пользователей хранятся в PostrgreSQL в захешированном виде с солью, чтобы в случае утечки нельзя было подобрать его по «радужным таблицам»
-
Запустить сервис
make docker-start-service-release
-
Получить токены Отправить POST-запрос на ручку
v1/authпорт 8080 с параметромname= логин и паролем в теле запроса. Можно воспользоваться дефолтнымиAlice — strong_passwordиIvan — ivan_password. В ответе будет возвращен токен -
Подключиться к серверу
nc localhost 8181
-
Идентифицировать себя, отправив
<логин>@<токен>\r\n\r\nКаждое сообщение должно оканчиваться\r\n\r\n. Если все сделано правильно — сервер вернет Server@OK -
Когда оба подключены, можно отправлять сообщения такого формата:
<логин получателя>@<сообщение>\r\n\r\n. Можно обратить внимание, что в процессе передачи сервер заменит логин получателя на логин отправителя
Пример общения
- Chat — фасад, скрывающий для ручек внутреннее устройство системы
- UserRegistry — реестр онлайн пользователей, хранящий в
RcuMapуказатели на очереди сообщений - AuthManager — отвечает за аутентификацию по паролю и выпуск токенов
Описание для makefile располагаются в файле





