Skip to content

optizone/tcp-chat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Aсинхронный TCP чат

Написан на Rust. Работа проверялась на ArchLinux дистрибутиве.

Протокол

Логин

Подразумевает последовательность действий:

  1. Отправка дескриптора сообщения с типом Login (1).
  2. Отправка заголовка сообщения (имя пользователя, UTF-8 строка).
  3. Ожидание ответа от сервера (дескриптор). Возможные ответы:
    • UsernameExists = 3
    • BadUsername = 4
    • BadLogin = 5

Сообщение

Подразумевает последовательность действий:

  1. Отправка дескриптора сообщения. Разрешенные типы сообщения:
    • File = 8
    • Utf8 = 7
    • Image = 6
    • Voice = 9
  2. Отправка заголовка сообщения (если есть).
  3. Отправка содержимого.

Формат дескриптора:

 0               1               2               3
 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Message Type          |         Header Size          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           Reserved                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Conten size (Hi)                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Conten size (Lo)                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Заголовок клиента - имя пользователя при отправке Login сообщения, имя файла при отправке File сообщения.

Заголовок сервера - сериализованная в формате JSON структура:

struct Header {
    pub from: String,    // sender of the message
    pub timestamp: DateTime<Utc>, // message timestamp
    pub filename: Option<String>,   // name of the file
}

Чтобы войти в комнату, клиент должен отправить дескриптор с Message type = Login и заголовок с to = "username", после чего дождаться ответа от сервера.

Как это выглядит

пример чата с тремя пользователями

Запуск

Сервер:

cargo run --bin server -- --address=<address>
# Default value for address is 127.0.0.1:8080

Клиент:

cd client
cargo run --bin client -- --address=<address> --username=<username> --save_directory==<save_directory>
# Default value for address is 127.0.0.1:8080
# Default value for save_directory is .

About

A simple example of a Tokio based TCP chat

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages