This repository has been archived by the owner on Sep 9, 2021. It is now read-only.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Инструкция по сборке/установке и использованию
Чат реализован на языке python, сборка не требуется.
Запуск сервера:
python3 chat_server.py (используется порт 1234)
При запуске сервера, если всё прошло успешно, он начинает слушать подключения к порту 1234, о чём сообщает в терминале:
Запуск клиента:
python3 chat_client.py [IP] [Port]
При запуске клиента, если всё прошло успешно, требуется ввести имя пользователя, после чего выводится приветственное сообщение и появляется возможность начать общение:
Описание используемого протокола
Имеется два типа пакетов: отправляемые от клиентов серверу и от сервера клиентам.
Формат пакетов, отправляемых от клиентов серверу:
Формат пакетов, отправляемых от сервера клиентам:
Размер Header-а фиксированный(5 байт). В нём содержится единственное число- длина в байтах следующего за ним сообщения. Соответственно, максимально возможная длина сообщения - 2^40 символов. В случае ввода сообщения длиной больше, чем 2^40 символов, будут получены только первые 2^40, а остальное отброшено. Размер Header-а настраивается в самих файлах chat_client.py и chat_server.py с помощью соответствующей константы.
Первым сообщением после установления соединения является отправка клиентом имени пользователя, которое сервер запоминает, после чего отправляются сами сообщения. Таким образом, имя пользователя в дальнейшем отправлять не приходится и формат пакета от клиента серверу получается с одним Header-ом и одним полем для данных.
В случае с отправкой сообщения от сервера клиентам, передаётся сначала Header с длиной имени пользователя, отправившего сообщение, которое должно быть доставлено всем остальным клиентам, затем собственно само имя пользователя, время отправки сообщения с сервера, Header с длиной сообщения и наконец само сообщение.
Принцип работы получается следующим:
На порту 1234 запускается сервер и ждёт TCP подключений от клиентов
Клиент подключается к серверу и первым сообщением после подключения отправляет своё имя пользователя
Сервер запоминает имя пользователя
Клиент получает возможность отправлять сообщения в чат
При отправке сообщения клиентом, сервер получает его, определяет имя пользователя, отправившего сообщение, и пересылает это сообщение всем остальным подключённым пользователям, в виде пакета, содержащего имя пользователя, время и, собственно, сообщение.
Клиенты получают сообщение от сервера, выделяют из него часть с именем пользователя, часть с временем и часть с текстом сообщения и отображают результат на экране.
При подключении клиентов к серверу (равно как и при их отключении) сервер отправляет от имени вошедшего (отключившегося) пользователя сообщение, говорящее о том, что пользователь с определённым именем вошёл в чат (покинул чат):
Пользователь может выйти из чата, завершив программу в терминале.
Пример работы
Клиент Windows_1:
Клиент Windows_2:
Клиент Linux_1:
Кроме всего прочего, вся важная информация о клиентах и сообщениях логируется на сервере: