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

Trushin_Ivan_lab1b #41

Closed

Conversation

gedar0082
Copy link

Trushin Ivan. Lab1b

@gedar0082
Copy link
Author

gedar0082 commented Dec 5, 2020

PR содержит 6 файлов:

  • ClientCode.java

  • ServerCode.java

  • ClientProj.jar

  • ServerProj.jar

  • clientConfig

  • serverConfig

Прелюдия

Код написан на компьютере с Windows, теста на Linux не проводил. Но в коде я не использовал решений, привязанных к конкретной платформе, так что должно работать на всех.
Для работы потребуется:

  • jre версии 8

Краткое описание работы протокола

Данная работа скорее имитирует протокол и его имплементацию, чем делает реальный протокол. Java sockets работают поверх TCP, поэтому весь протокол заключается в том, чтобы расставить указатели на время, имя и текст сообщения так, чтобы их можно было легко вытянуть из одной строки, которыми и общаются сокеты, и использовать независимо. Имплементация протокола и его использования по сути действие обратное - получить независимые элементы с помощью протокола и расположить их в пользовательском интерфейса(в моём случае в формате, заданном по заданию HH:MM [username] textMessage -> <13:37> [SaShA13pOsHliy] Hello world!)

протокол представляет из себя вот что:
клиент при запуске чата вводит своё имя(никто не сможет написать ничего от твоего имени, так как будет заходить только под своим. Но никто не мешает при запуске приложения указать человеку чужое имя, но тогда это уже будет его имя. Для большего нужен механизм регистрации, но я не вижу в этом необходимости)
После клиент пишет сообщение в командной строке и нажимает Enter, подтверждая завершенность текста.
Это сообщение проверяется на соответствие размера буферу, который указывается в конфигурационном файле, после чего находится длина его сообщения и длина его имени. Числа длины его сообщения и длины его имени хранятся в формате char, а так как char двухбайтовый, то это естественным образом формирует максимальную длину и имени, и сообщения в 65535 символов. Эти чары вместе с самим текстом сообщения и именем, хранящимися в String, формируют итоговое сообщение, записываемое в сокет, вот в таком формате:
image

Зная правило, по которому на сервер от клиента отправляется строка(это и есть протокол), можно легко выделить независимые части в виде имени и текста.

Сервер, получая данное сообщение, должен добавить ему время, так как лучше, чтобы временем руководил именно сервер. Сервер добавляет в начало полученной сырой строки длину полученного времени(хранящуюся в одном char) и само время(хранящееся в String). Время используется GMT, то есть с offset = 0. Выглядит это примерно так:
image
(строго говоря, в данной реализации время всегда будет занимать 5 char - HH:mm, но так сделать было отсылкой на решение остальных задач)
Клиент получает данную строку, которую ему отправляет сервер(отправляет всем подключенным клиентам) и клиент занимается тем, что, зная протокол, разбивает её на составляющие даты, имени и текста и компонует по своему усмотрению. На этом этапе, после парсинга, но перед компоновкой, клиент меняет время UTC+00:00 на своё с учетом своей временной зоны. Поэтому у каждого клиента время отображается корректно по отношению к его временной зоне.

Краткое описание файлов

ClientCode.java
Это файл с исходниками клиента.

ServerCode.java
Это файл с исходниками сервера

ClientProj.jar
Это собранный проект клиента, запускаемый из командной строки

ServerProj.jar
Это собранный проект сервера, запускаемый из командной строки

clientConfig
Это конфигурационный файл, содержащий port, ip, buffer, которые нужны для запуска клиента. При отсутствии данного файла он будет использовать настройки по умолчанию: Ip = "127.0.0.1", port = 8000.

serverConfig
Это конфигурационный файл, содержащий port, buffer нужный для запуска сервера. При отсутствии данного файла он будет использовать настройки по умолчанию: port = 8000, buffer = 255 ограничивает максимальную длину сообщения.

Инструкция по запуску

Сначала запускается сервер, потом клиент

  1. Открыть командную строку(в моём случае PowerShell)
    image

  2. Добраться до папки, в которой лежит сервер
    image

  3. Написать(тестировал только для Windows) "java -jar ServerProj.jar" (не нажимать Enter)
    image

  4. Указать путь то своего файла serverConfig(в моём случае так) и нажать Enter
    image

  5. Если вывелась вот эта строка, значит сервер стартовал успешно
    image

  6. Открыть новую командную строку
    image

  7. Перейти в папку, где лежит ClientProj.jar
    image

  8. Написать(не нажимать Enter) "java -jar ClientProj.jar"
    image

  9. Через пробел написать своё имя(не используя пробелов)(не нажимать Enter)
    image

  10. Еще через пробел написать путь до своего clientConfig
    image

  11. Нажать Enter

Если будут показаны значения ip, port те, какими вы их задавали в файле конфигурации, то значит все отлично. В противном случае будут заданы значения по умолчанию.
Можно что-то написать:
image

Соответствующий вывод сервера:
image

Можно добавить еще одного клиента:
image

Вот что показывает окно другого клиента:
image

А вот окно сервера:
image

@gedar0082 gedar0082 closed this Dec 7, 2020
@gedar0082 gedar0082 reopened this Dec 7, 2020
@ejiektpobehuk
Copy link
Contributor

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

@gedar0082
Copy link
Author

gedar0082 commented Dec 9, 2020

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

Переделал весь проект на байты

@gedar0082 gedar0082 closed this Dec 9, 2020
@gedar0082 gedar0082 reopened this Dec 9, 2020
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