Skip to content
This repository has been archived by the owner on Sep 9, 2021. It is now read-only.

Иванов Илья, 3530901/70203, lab_1a #48

Closed

Conversation

BigAwesomeTurtle
Copy link

Инструкция по сборке/установке и использованию

Чат реализован на языке python, сборка не требуется.
Запуск сервера:
python3 chat_server.py (используется порт 1234)
При запуске сервера, если всё прошло успешно, он начинает слушать подключения к порту 1234, о чём сообщает в терминале:
image

Запуск клиента:
python3 chat_client.py [IP] [Port]
При запуске клиента, если всё прошло успешно, требуется ввести имя пользователя, после чего выводится приветственное сообщение и появляется возможность начать общение:
image

Описание используемого протокола

Имеется два типа пакетов: отправляемые от клиентов серверу и от сервера клиентам.

Формат пакетов, отправляемых от клиентов серверу:

Header Message

Формат пакетов, отправляемых от сервера клиентам:

Header Username Time Header Message

Размер Header-а фиксированный(5 байт). В нём содержится единственное число- длина в байтах следующего за ним сообщения. Соответственно, максимально возможная длина сообщения - 2^40 символов. В случае ввода сообщения длиной больше, чем 2^40 символов, будут получены только первые 2^40, а остальное отброшено. Размер Header-а настраивается в самих файлах chat_client.py и chat_server.py с помощью соответствующей константы.

Первым сообщением после установления соединения является отправка клиентом имени пользователя, которое сервер запоминает, после чего отправляются сами сообщения. Таким образом, имя пользователя в дальнейшем отправлять не приходится и формат пакета от клиента серверу получается с одним Header-ом и одним полем для данных.

В случае с отправкой сообщения от сервера клиентам, передаётся сначала Header с длиной имени пользователя, отправившего сообщение, которое должно быть доставлено всем остальным клиентам, затем собственно само имя пользователя, время отправки сообщения с сервера, Header с длиной сообщения и наконец само сообщение.

Принцип работы получается следующим:

  1. На порту 1234 запускается сервер и ждёт TCP подключений от клиентов

  2. Клиент подключается к серверу и первым сообщением после подключения отправляет своё имя пользователя

  3. Сервер запоминает имя пользователя

  4. Клиент получает возможность отправлять сообщения в чат

  5. При отправке сообщения клиентом, сервер получает его, определяет имя пользователя, отправившего сообщение, и пересылает это сообщение всем остальным подключённым пользователям, в виде пакета, содержащего имя пользователя, время и, собственно, сообщение.

  6. Клиенты получают сообщение от сервера, выделяют из него часть с именем пользователя, часть с временем и часть с текстом сообщения и отображают результат на экране.

  7. При подключении клиентов к серверу (равно как и при их отключении) сервер отправляет от имени вошедшего (отключившегося) пользователя сообщение, говорящее о том, что пользователь с определённым именем вошёл в чат (покинул чат):
    image
    image

  8. Пользователь может выйти из чата, завершив программу в терминале.

Пример работы

Клиент Windows_1:
image

Клиент Windows_2:
image

Клиент Linux_1:
image

Кроме всего прочего, вся важная информация о клиентах и сообщениях логируется на сервере:
image

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants