Клиент-серверная передача данных на примере системы автоматизации рабочего места начальника охраны объекта

NovaInfo 44, с.18-23, скачать PDF
Опубликовано
Раздел: Технические науки
Просмотров за месяц: 2
CC BY-NC

Аннотация

Особенности клиент-серверной передачи разнородных данных на языке си шарп. Существующие технологии передачи данных. Возможные проблемы и способы их решения. Плюсы и минусы сериализации данных.

Ключевые слова

СЕРИАЛИЗАЦИЯ, С#, СЕРВЕР, КЛИЕНТ

Текст научной работы

Клиент-серверные приложения активно применяются в образовании [7-10], науке [1, 3, 11] и производстве [2, 4-6] для обеспечения рабочего процесса, наделения сотрудников удобными рабочими инструментами, и, как следствие, повышения производительности труда.

При разработке клиент-серверного приложения часто возникает вопрос передачи разнородных данных одним пакетом. На текущий момент существует много технологий, обеспечивающих данную возможность, но подавляющее число подобных технологий основано на XML-технологиях. Что автоматически увеличивает объем передаваемых данных. Да и необходимость настройки подобных технологий для начинающих программистов может быть достаточно сложна.

Стандартная передача с помощью сокетов позволяет передавать только массив байт. Как следствие, наиболее распространённый способ передачи данных между клиентом и сервером представляет собой текстовую строку, которую потом переводят в массив стандартными функциями. Минусы данного способа понятны. Во-первых, данные, которые требуется передать от клиента к серверу, редко ограничиваются чистым текстом, как следствие, строку требуется составить. Во-вторых, для получения структуры передаваемых данных, требуется длительная обработка полученной строки (парсинг).

Для устранения данных проблем можно использовать XML-сериализацию. Данная возможность автоматически превращает необходимый класс в текст, который затем можно представить как массив байт для передачи на сервер. Данный способ имеет существенное преимущество перед составлением строки вручную – составление и парсинг текста происходит в автоматическом режиме, что не требует от программиста особых трудозатрат. Но недостаток у него тоже имеется – сама XML-разметка занимает достаточно много места. И при передаче больших объемов данных (например, таблиц), сильно увеличивает нагрузку на линию связи.

В качестве третьего варианта (о котором и пойдет речь в данной статье) есть возможность использовать бинарную сериализацию: в этом случае класс сразу конвертируется в массив байт, готовый для передачи, без промежуточных этапов. Что, с одной стороны, упрощает программу, с другой, уменьшает объем передаваемых данных за счет отсутствия дополнительной разметки. Из минусов данного способа можно рассмотреть необходимость использования на клиенте и сервере одинаковых сборок класса для передачи, что вынуждает все передаваемые классы выводить в отдельную динамическую библиотеку.

Далее на примере системы автоматизации рабочего места начальника охраны объекта мы разберем конкретные действия по организации передачи данных посредством бинарной сериализации. Данная система во время своей работы передает разнородные данные: запросы к БД, таблицы результатов, команды серверу с различными параметрами. Для того чтобы увязать все это в единую систему, требуется определенная иерархия объектов.

Для начала потребуется класс-«обертка», в котором мы будем передавать наши данные.

Назовем его «transfer». Данный класс имеет несколько полей:

Текстовое поле «CommandName» - в нем мы будем передавать имя команды.

Строковый массив «Parametr» - в нем будут передаваться те или иные параметры команды.

И коллекция объектов «Collection» - а в данной коллекции будет передаваться рабочие классы.

   [Serializable]
    public class Transfer:Object
    {
        public string CommandName;
        public string[] Parametr;
        public List Collection;
    }

Внимание: атрибут класса «[Serializable]» показывает компилятору, что данный класс допускается для сериализации. Использование его – обязательно. Причем, как в данном классе, так и в классах, которые будут передаваться в дальнейшем.

Еще требуется уточнение. Если по первым двум полям передающего класса пояснений не требуется, то по последнему могут возникнуть вопросы: почему коллекция и почему «object». Первое требуется для обеспечения неограниченного количества объектов в коллекции (нам не требуется точно знать, сколько строк вернет нам наша база данных), второе… Поскольку мы не знаем, какого типа объект мы планируем передавать серверу (ибо варианты объектов могут быть какими угодно), удобнее формировать коллекцию из объектов верхнего уровня, а затем явно приводить их в нужную форму, в зависимости от типа команды.

Далее нам потребуются конкретные классы (модели) для передачи данных в зависимости от команды. Рассмотрим таблицу «Задержания»: здесь шестнадцать текстовых полей, в которых хранятся данные о задержанных. Для работы с этой таблицей нам потребуется создать класс (модель) которая описывает одну строку таблицы:

[Serializable]
    public class Arest
    {
        public int id { set; get; }
        public DateTime dateArest { set; get; }
        public DateTime dateInput { set; get; }
        public string lastName { set; get; }
        public string firstName { set; get; }
        public string patronymic { set; get; }
        public string locArest { set; get; }
        public string reason { set; get; }
        public string fabula { set; get; }
        public bool ugCase { set; get; }
        public string numberFaiure {set;get;}
        public string numberCase { set; get; }
        public string resolutionMaterial { set; get; }
        public string resolutionCourt { set; get; }
        public string male { set; get; }
        public int idUser { set; get; }
    }

Не будем останавливаться на значениях данных полей, ибо данное не актуально в рамках текущей статьи. Но на три нюанса стоит обратить внимание: первый – это атрибут «[Serializable]» который, как было сказано выше, необходим для любых классов, участвующих в передаче данных. Второй – это автоматические свойства у каждого поля, они требуются для прямой работы с базой данных. Третий нюанс заключается в том, что все классы для передачи данных должны быть выделены в отдельную DLL и подключены как к клиенту, так и к серверу.

После того, как мы создали данный класс, мы получили возможность полноценной работы с одной таблицей БД. Теперь приведу пример использования данного класса (большая часть кода будет обрезана, как не касающаяся темы данной статьи).

Рассмотрим пример добавления данных в БД.

Выводим на клиенте поле для ввода, введенные данные записываем в нашу модель «Arest»

После чего формируем запрос на сервер:

Transfer transfer = new Transfer();
transfer.CommandName = "InputArest";
transfer.Collection.Add(Arest);
BinaryFormatter bin = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
bin.Serialize(stream, transfer);
int bytesSent = Client.Send(stream.GetBuffer());

В первых трех строчках мы формируем класс-оболочку «Transfer», в качестве названия команды мы задаем «InputArest», в качестве коллекции – нашу модель.

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

И следующей командой отправляем её на сервер. Передача завершена.

Обработка данных на сервере происходит следующим образом:

MemoryStream stream;
Transport.Transfer transfer;
bytesRec = handler.Receive(bytes);
stream = new MemoryStream(bytes, 0, bytesRec);
transfer = Serialization.Deserialize(stream);
switch (transfer.CommandName)
      { 
        case "InputArest":
        transfer.CommandName = "success";
        Arest arest = (Arest)transfer.Collection[0];
        DataQuery.AddArest(arest);
        break;
      }

Здесь команда «handler.Receive(bytes)» получает от клиента массив байт. После чего следующими двумя строками массив десериализуется обратно в класс-оболочку.

Далее с помощью команды «switch» осуществляется выбор команды, которая будет реализовываться. После чего в строках:

Arest arest = (Arest)transfer.Collection[0];
        DataQuery.AddArest(arest);

Происходит запись в модель «Arest» первого элемента коллекции (с явным приведением к данной модели) и запись строки в базу.

Ответы сервера, и любые другие команды реализуются аналогичным образом.

Данный способ обеспечивает более четкое структурирование запросов и ответов между клиентом и сервером (благодаря оператору «switch») и минимальную нагрузку на канал связи (благодаря бинарной сериализации).

Читайте также

Список литературы

  1. Азаров А.В., Рыбанов А.А. Автоматизированная система расчета метрических характеристик физической схемы базы данных с целью оценки трудоемкости процесса проектирования // Современная техника и технологии. 2014. № 5 (33). С. 39.
  2. Богушенков А.С., Рыбанов А.А. Разработка и исследование алгоритмов автоматизированной системы учета и поиска информации по пакетам труб на основе технологии qr-кода // Молодой ученый. 2015. № 4 (84). С. 47-52.
  3. Бутенко Д.В., Рыбанов А.А., Чернухин А.В., Бутенко Л.Н. Компьютерная поддержка ассоциативного поиска инновационных решений // Известия ЮФУ. Технические науки. 1998. № 2 (8). С. 258-259.
  4. Лебединский А.И., Рыбанов А.А. Автоматизация мониторинга топлива в резервуарах азс на базе измерительного комплекса «струна» с целью повышения эффективности принимаемых решений специалистом отдела логистики // Молодой ученый. 2014. № 7. С. 35-40.
  5. Моисеев Ю.И., Билялов М.Х., Рыбанов А.А. Cистема идентификации водителя на примере туристического междугороднего автобуса ВОЛЖАНИН 5285 // Вестник магистратуры. 2013. № 5 (20). С. 63-67.
  6. Рыбанов А.А. Автоматизированное рабочее место рыбовода осетрового завода // Сельское, лесное и водное хозяйство. 2014. № 5 (32). С. 3.
  7. Рыбанов А.А. Технологии удаленного управления компьютером в повышении эффективности взаимодействия участников образовательного процесса // Дистанционное и виртуальное обучение. 2010. № 9. С. 28-34.
  8. Рыбанов А.А., Любимова О.В. Разработка web-ориентированного программного модуля мониторинга формирования уровня компетентности студентов технических вузов на основе контрольных карт и гистограмм // Молодой ученый. 2014. № 9 (68). С. 23-26.
  9. Рыбанов А.А., Рыльков А.В. // Разработка web-ориентированной информационной системы мониторинга и управления процессом прохождения производственной практики // Молодой ученый. 2013. № 7. С. 34-36.
  10. Рыбанов А.А., Самодьянова А.С. Разработка web-ориентированной экспертной системы оценки качества педагогических тестов // Молодой ученый. 2014. № 9 (68). С. 31-34.
  11. Сова Е.В., Рыбанов А.А. Cравнительный анализ библиотек генерации отчетов в веб-ориентированных информационных системах // Международный журнал прикладных и фундаментальных исследований. 2012. № 7. С. 167.

Цитировать

Котов, В.В. Клиент-серверная передача данных на примере системы автоматизации рабочего места начальника охраны объекта / В.В. Котов. — Текст : электронный // NovaInfo, 2016. — № 44. — С. 18-23. — URL: https://novainfo.ru/article/5551 (дата обращения: 17.05.2022).

Поделиться