Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

ТЕХНОЛОГИЯ «КЛИЕНТ-СЕРВЕР» (Определение сервера и клиента)

Содержание:

Введение

Актуальность. Как результат эволюции компьютерных технологий появились компьютерные сети. Само появление компьютерных сетей ознаменовало новый этап в компьютерной технологии.

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

С совершенствованием аппаратной части сетей совершенствовалось и сетевое программное обеспечение. Со временем потребовалось совершенствование самих технологий, а не только развитие аппаратуры и программного обеспечения. Были разработаны современные сетевые технологии. Одной из таких технологий является технология «клиент-сервер», позволяющая пользователям сети получать быстрый доступ к ресурсам.

Архитектура клиент-сервер интересна и актуальна главным образом потому, что обеспечивает простое и относительно дешевое решение проблемы коллективного доступа к базам данных в локальной сети.

Цель работы: рассмотреть технологию «клиент-сервер» теоретически и на практическом примере.

Исходя из цели были поставлены следующие задачи:

  1. Определить понятия сервера и клиента;
  2. Рассмотреть роль сервера и клиента в архитектуре клиент-сервер;
  3. Определить преимущества архитектуры клиент-сервера;
  4. Определить компоненты архитектуры клиент-сервер
  5. Рассмотреть модели архитектуры клиент-сервер
  6. Определить сущность понятия сетевые протоколы и их виды;
  7. Разработать приложение «Чат» с применением технологи «клиент-сервер».

Предмет: технология клиент-сервер.

В работе использованы методы анализа, синтеза и графический метод. В работе использованы монографии, учебные пособия и статьи из журналов отечественных ученых.

Работа состоит из 33 страниц печатного текста, содержит 8 рисунков.

1. Характеристика и основные понятия архитектуры клиент-сервер

Определение сервера и клиента

При большом числе компьютеров (десятки, сотни и даже тысячи) предприятия чаще всего полагаются на сети модели «клиент-сервер». Упрощенно можно считать, что в такой сети отдельный компьютер подключается к одному или нескольким мощным компьютерам, которые называются серверами [5].

Архитектура клиент - сервер (client-server architecture) - это концепция информационной сети, в которой основная часть ее ресурсов сосредоточена в серверах, обслуживающих своих клиентов (рис. 1). Рассматриваемая архитектура определяет два типа компонентов: серверы и клиенты.

Рис.1 Архитектура клиент – сервер [5]

Сервер - это компьютер, или выполняющаяся на нём программа, которая предоставляет клиентам доступ к общим ресурсам и управляет этими ресурсами.

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

Сервисная функция в архитектуре клиент - сервер описывается комплексом прикладных программ, в соответствии с которым выполняются разнообразные прикладные процессы [1].

Процесс, который вызывает сервисную функцию с помощью определенных операций, называется клиентом. Им может быть программа или пользователь.

Клиенты – это рабочие станции, которые используют ресурсы сервера и предоставляют удобные интерфейсы пользователя. Интерфейсы пользователя - это процедуры взаимодействия пользователя с системой или сетью.

На рис. 2 приведен перечень сервисов в архитектуре клиент – сервер.

Рис. 2 Модель клиент-сервер [5]

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

В сетях с выделенным файловым сервером на выделенном автономном ПК устанавливается серверная сетевая операционная система. Этот ПК становится сервером. Программное обеспечение (ПО), установленное на рабочей станции, позволяет ей обмениваться данными с сервером. Наиболее распространенные сетевые операционная системы:

  • NetWare фирмы Novel;
  • Windows NT фирмы Microsoft;
  • UNIX фирмы AT&T;
  • Linux [13].

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

Сети на базе серверов имеют лучшие характеристики и повышенную надежность. Сервер владеет главными ресурсами сети, к которым обращаются остальные рабочие станции [6].

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

Роль сервера и клиента в архитектуре клиент-сервер

Роль серверов состоит в обеспечение централизованной защиты и управлении трафиком, а также в предоставление клиентам ресурсов: информации, приложений и доступа к устройствам совместного пользования (например, к принтерам). В клиент - серверной среде в роли клиентов выступают настольные ПК под управлением операционной системы. Как правило, клиент использует собственные вычислительные мощности для обработки информации, полученной от сервера, но полагается на сервер в части предоставления необходимых данных и приложений. Такое распределение ролей в обработке информации носит название клиентской (front - end) и серверной (back - end) обработки [6].

Наряду с успешным функционированием в собственной «родной» среде, сети модели клиент - сервер могут работать с микрокомпьютерами и мэйнфреймами. Именно эта гибкость в сочетании достаточно низкой (по сравнению с традиционными решениями) стоимостью и составляет привлекательность клиент - серверных сетей. Работая в такой среде на компьютере - клиенте, можно «вкушать плоды» трех разных методов обработки информации: автономной работы, взаимодействия с другими ПК сети и подключения к серверу или мэйнфрейму для доступа к хранящейся там информации.

Преимущества и недостатки архитектуры клиент-сервер

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

В большинстве случаев программа обработки (клиентская часть) расположена на одном компьютере, а сама база данных хранится на другом. Помимо хранения централизованной базы данных центральная машина (сервер базы данных) обеспечивает выполнение основного объема обработки данных. Запрос на данные, выдаваемый клиентом (рабочей станцией), порождает поиск и извлечение данных на сервере. Извлеченные данные транспортируются по сети от сервера к клиенту. Причем, по сети передается только полезная информация [7].

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

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

Быстродействие - основной фактор целесообразности разработки систем для архитектуры клиент-сервер. Применение средств быстрой разработки программ (Rapid Application Development - RAD) позволяет разработчикам создавать прикладные системы для архитектуры клиент-сервер в рекордно короткие сроки. Технология серверов баз данных также становится проще в использовании и сочетается в одних системах со средствами RAD. Таким образом, сокращается время, необходимое для подготовки и передачи прикладной программы пользователю [8].

Сети клиент - серверной архитектуры имеют следующие преимущества:

  • позволяют организовывать сети с большим количеством рабочих станций;
  • обеспечивают централизованное управление учетными записями пользователей, безопасностью и доступом, что упрощает сетевое администрирование;
  • эффективный доступ к сетевым ресурсам;
  • пользователю нужен один пароль для входа в сеть и для получения доступа ко всем ресурсам, на которые распространяются права пользователя.

Наряду с преимуществами сети клиент – серверной архитектуры имеют и ряд недостатков:

  • неисправность сервера может сделать сеть неработоспособной, как минимум потерю сетевых ресурсов;
  • требуют квалифицированного персонала для администрирования;
  • имеют более высокую стоимость сетей и сетевого оборудования [14].

Компоненты архитектуры клиент-сервер

Существуют три основных программных компонента архитектуры клиент-сервер:

  1. Программное обеспечение конечного пользователя;
  2. Промежуточное обеспечение;
  3. Программное обеспечение сервера.

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

Промежуточное обеспечение предоставляет общий интерфейс для ПО конечного пользователя и сервера, проникающий сквозь слои GUI (графический интерфейс пользователя), операционную систему, вычислительной сети и собственных драйверов базы данных с помощью общих вызовов. Для завершения операции сервер базы данных выполняет запрос и передает клиенту затребованные данные для обработки их программой клиента [4].

Под ПО сервера подразумевается операционная система и конкретный сервер базы данных, используемый для обработки запросов клиентской части информационной системы.

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

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

Модели архитектуры клиент-сервер

Обычно выделяют три модели взаимодействия клиента и сервера:

RDA (Remote Data Access) – модель «доступа к удаленным данным», при которой данные и программы, обеспечивающие доступ к данным по сети, располагаются на сервере, а программы решения прикладных задач, организации ввода информации и отображения результатов - на рабочей станции клиента.

DBS (DataBase Server) - модель сервера базы данных, в которой компонента представления размещена в клиентской части, а прикладная компонента и доступ к информационным ресурсам - в серверной.

AS (Application Server) - модель сервера приложений, в которой компонента представления находиться в клиентской части, прикладная компонента - в «сервере приложения», а компонента доступа к информационным ресурсам - в «сервере базы данных» [9].

В RDA-модели коды компонента представления и прикладного компонента совмещены и выполняются на компьютере-клиенте. Последний поддерживает как функции ввода и отображения данных, так и чисто прикладные функции. Доступ к информационным ресурсам обеспечивается, как правило, операторами специального языка (языка SQL, например, если речь идет о базах данных) или вызовами функций специальной библиотеки. Запросы к информационным ресурсам направляются по сети удаленному компьютеру (например, серверу базы данных). Последний обрабатывает и выполняет запросы и возвращает клиенту блоки данных [15].

DBS-модель строится в предположении, что процесс, выполняемый на компьютере-клиенте, ограничивается функциями представления, в то время как собственно прикладные функции реализованы в хранимых процедурах. Они хранятся непосредственно в базе данных и выполняются на компьютере-сервере базы данных [3].

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

Понятие прикладных протоколов

Необходимо различать понятия сетевых приложений и протоколов прикладного уровня. Протоколы прикладного уровня являются частью (хотя и весьма большой) сетевых приложений. Рассмотрим два примера. Web является сетевым приложением, позволяющим пользователям получать web-документы по запросу и состоящим из множества компонентов, включая стандарт формата документов (HTML), браузеры (Netscape Navigator, Microsoft Internet Explorer и др.), web-серверы (например, Apache, Microsoft или Netscape), протоколы прикладного уровня. Протокол прикладного уровня для web носит название протокола передачи гипертекста (HyperText Transfer Protocol, HTTP) и описывает формат и порядок обмена сообщениями между клиентом и сервером (RFC 2646). Таким образом, HTTP является лишь частью web-приложения [11].

В качестве второго примера рассмотрим приложение электронной почты. Электронная почта Интернета также состоит из множества компонентов: почтовых серверов, содержащих почтовые ящики пользователей, программ для просмотра и создания электронных писем, стандартов, описывающих структуру электронных писем, протоколов прикладного уровня, регламентирующих порядок обмена сообщениями серверов между собой и с оконечными системами пользователей, а также интерпретацию полей, из которых состоят электронные письма. Основным протоколом прикладного уровня для электронной почты является протокол простой передачи сообщений (Simple Mail Transfer Protocol, SMTP). Как мы видим, SMTP (RFC 2821) - лишь часть (хотя и достаточно большая) структуры приложений электронной почты.

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

  1. Типы используемых сообщений, например запросы и ответы;
  2. Синтаксис каждого из типов сообщений, описывающий поля сообщения и их разделители;
  3. Семантику полей, то есть смысл информации, содержащейся в каждом из полей сообщения;
  4. Правила, описывающие события, которые вызывают генерацию сообщений.

Некоторые из протоколов прикладного доступа (HTTP, SMTP) являются официально документированными в RFC. Это означает, что если разработчик нового браузера будет следовать стандарту, то браузер сможет получать документы с любого web-сервера, построенного по этому же стандарту. Тем не менее существует множество протоколов прикладного уровня, которые не стандартизированы и при этом используются для поддержки коммерческих продуктов. В частности, это характерно для Интернет-телефонии [12]. В данном разделе была рассмотрена технология клиент-сервер.

2. Разработка приложения «Чат» с применением технологи «клиент-сервер»

Выбор средств разработки программы

Для разработки программы «Чат» был выбрал язык разработки С#. Данный язык хорошо подходит для создания оконных форм приложений.

C# - это объектно-ориентированное программирование. Он был разработан в 2001 году, инженерами под руководством Андерса Хейлсберга в компании Microsoft.

Название «Си Шарп» (от англ. sharp - диез) происходит от музыкальной нотации, где знак диез, прибавляемый к основному обозначению ноты, означает повышение соответствующего этой ноте звука на полутон. Это аналогично названию языка С++, где «++» обозначает, что переменная должна быть увеличена на 1.

C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.

К числу принципиально важных решений, которые реализованы корпорацией Microsoft в языке программирования C#, можно отнести следующие:

  • компонентно-ориентированный подход к программированию (который характерен и для идеологии Microsoft .NET в целом);
  • свойства как средство инкапсуляции данных (характерно также в целом для ООП);
  • обработка событий (имеются расширения, в том числе в части обработки исключений, в частности, оператор try);
  • унифицированная система типизации (соответствует идеологии Microsoft .NET в целом);
  • делегаты (delegate - развитие указателя на функцию в языках C и C++); - индексаторы (indexer - операторы индекса для обращения к элементам класса- контейнера);
  • перегруженные операторы (развитие ООП);
  • оператор foreach (обработка всех элементов классов-коллекций, аналог Visual Basic);
  • механизмы boxing и unboxing для преобразования типов;
  • атрибуты (средство оперирования метаданными в COM-модели);
  • прямоугольные массивы (набор элементов с доступом по номеру индекса и одинаковым количеством столбцов и строк).

Достоинства си-шарп:

  1. C# создавался параллельно с каркасом Framework .Net и в полной мере учитывает все его возможности - как FCL, так и CLR;
  2. C# является полностью объектно-ориентированным языком, где даже типы, встроенные в язык, представлены классами;
  3. C# является мощным объектным языком с возможностями наследования и универсализации;
  4. C# является наследником языков C/C++, сохраняя лучшие черты этих популярных языков программирования. Общий с этими языками синтаксис, знакомые операторы языка облегчают переход программистов от С++ к C#;
  5. Сохранив основные черты своего великого родителя, язык стал проще и надежнее. Простота и надежность, главным образом, связаны с тем, что на C# хотя и допускаются, но не поощряются такие опасные свойства С++ как указатели, адресация, разыменование, адресная арифметика;
  6. Благодаря каркасу Framework .Net, ставшему надстройкой над операционной системой, программисты C# получают те же преимущества работы с виртуальной машиной, что и программисты Java. Эффективность кода даже повышается, поскольку исполнительная среда CLR представляет собой компилятор промежуточного языка, в то время как виртуальная Java-машина является интерпретатором байт-кода;
  7. Мощная библиотека каркаса поддерживает удобство построения различных типов приложений на C#, позволяя легко строить Web-службы, другие виды компонентов, достаточно просто сохранять и получать информацию из базы данных и других хранилищ данных;
  8. Реализация, сочетающая построение надежного и эффективного кода, является немаловажным фактором, способствующим успеху C#.

Для разработки программы «Чат» выбрана среда разработки Visual Studio 2017.

Блок-схема алгоритма работы программы

Для разработки программы «Чат» был применен объектно-ориентированный подход. Для упрощения реализации программы были разработаны две диаграммы классов.

На рис. 3 представлен диаграмма классов клиентской части программы.

Рис. 3 Диаграмма классов (клиентская часть)

Как видно с рис. 3 для разработки клиентской части использовано 4 класса: Data, Resources, LoginForm, SGSClient.

На рис. 4 представлен диаграмма классов серверной части программы.

Рис. 4 Диаграмма классов (серверная часть)

Как видно с рис. 4 для разработки серверной части использовано 3 класса: Resources, Data, SGServerForm.

Описание программы

Программный комплекс «Чат» состоит из двух частей (решений в Visual Studio). Из серверной и клиентской части соответственно.

  1. Серверная часть – SGSserverTCP.

Команды для взаимодействия между сервером и клиентом описаны в перечислении enum Command

{

Login, //Log into the server

Logout, //Logout of the server

Message, //Send a text message to all the chat clients

List, //Get a list of users in the chat room from the server

Null //No command

}

Далее основной идет класс SGSserverForm. Структура ClientInfo содержит необходимую информацию о каждом клиенте, что подключен к серверу:

struct ClientInfo

{

public Socket socket; //Socket of the client

public string strName; //Name by which the user logged into the chat room

}

Коллекция всех клиентов, вошедших в комнату, содержится в массиве типа ClientInfo - ArrayList clientList. А основной сокет, на котором сервер слушает клиентов называется Socket serverSocket;

Массив, для информации что передается записан как byte[] byteData = new byte[1024];

В программе использованы следующие компоненты:

  1. Конструктор для формы:

public SGSserverForm()

{

clientList = new ArrayList();

InitializeComponent();

}

  1. Функция при загрузке формы

private void Form1_Load(object sender, EventArgs e)

{

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

try

{

//Использование TCP сокетов

serverSocket = new Socket(AddressFamily.InterNetwork,

SocketType.Stream,

ProtocolType.Tcp);

// Назначение IP-адреса машины и прослушивание порта 1000 IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 1000);

// Привязка и прослушивание по указанному адресу

serverSocket.Bind(ipEndPoint);

serverSocket.Listen(4);

//Принятие входящих клиентов-соединений

serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "SGSserverTCP",

MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

  1. Функция принятие подключения

private void OnAccept(IAsyncResult ar)

{

try

{

Socket clientSocket = serverSocket.EndAccept(ar);

//Мониторим еще клиентов, если они появятся для подключение

serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);

// Как только клиент подключится, начинаем получать от него команды

clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None,

new AsyncCallback(OnReceive), clientSocket);

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "SGSserverTCP",

MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

  1. Функция при получении информации от клиента

private void OnReceive(IAsyncResult ar)

  1. Выбор какую команду получили (из перечисления enum Command)

switch (msgReceived.cmdCommand)

  1. Вылавливание ошибок, если команда не соответствует не одной

catch (Exception ex)

  1. Функция-реакция на отправку сообщения

public void OnSend(IAsyncResult ar)

  1. Класс данных, с которыми сервер и клиент взаимодействуют друг с другом

class Data

public string strName; //Name by which the client logs into the room

public string strMessage; //Message text

public Command cmdCommand; //Command type (login, logout, send message, etcetera)

  1. Функция-метод, что преобразует структуру данных в массив байтов

public byte[] ToByte()

{

var result = new List<byte>();

//First four are for the Command

result.AddRange(BitConverter.GetBytes((int)cmdCommand));

byte[] bytesText = Encoding.UTF8.GetBytes(strMessage ?? "");

byte[] bytesName = Encoding.UTF8.GetBytes(strName ?? "");

//Add the length of the name

result.AddRange(BitConverter.GetBytes(bytesName.Length));

result.AddRange(BitConverter.GetBytes(bytesText.Length));

//Add the name

result.AddRange(bytesName);

//And, lastly we add the message text to our array of bytes

result.AddRange(bytesText);

return result.ToArray();

}

  1. Клиентская часть: SGSclientTCP

В программе использована следующие компоненты

  1. Форма логина

public partial class LoginForm : Form

  1. Сокет

public Socket clientSocket;

  1. Логин клиента

public string strName;

  1. Функция реакция на нажатие кнопки ОК при логине

private void btnOK_Click(object sender, EventArgs e)

{

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

try

{

clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPAddress ipAddress = IPAddress.Parse(txtServerIP.Text);

//Server is listening on port 1000

IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 1000);

//Connect to the server

clientSocket.BeginConnect(ipEndPoint, new AsyncCallback(OnConnect), null);

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "SGSclient", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

  1. Метод при отправке

private void OnSend(IAsyncResult ar)

{

try

{

clientSocket.EndSend(ar);

strName = txtName.Text;

DialogResult = DialogResult.OK;

Close();

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "SGSclient", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

  1. Метод-реакция при подключении

private void OnConnect(IAsyncResult ar)

{

try

{

clientSocket.EndConnect(ar);

//We are connected so we login into the server

Data msgToSend = new Data ();

msgToSend.cmdCommand = Command.Login;

msgToSend.strName = txtName.Text;

msgToSend.strMessage = null;

byte[] b = msgToSend.ToByte ();

//Send the message to the server

clientSocket.BeginSend(b, 0, b.Length, SocketFlags.None, new AsyncCallback(OnSend), null);

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "SGSclient", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

  1. Кнопка выхода

private void btnCancel_Click(object sender, EventArgs e)

{

Close();

}

  1. Команды для взаимодействия между сервером и клиентом описаны в перечислении enum Command

{

Login, //Log into the server

Logout, //Logout of the server

Message, //Send a text message to all the chat clients

List, //Get a list of users in the chat room from the server

Null //No command

}

Далее рассматриваем основной класс public partial class SGSClient.

  1. Сокет

public Socket clientSocket;

  1. Логин клиента

public string strName;

  1. Конструктор для формы

public SGSClient()

  1. Трансляция сообщения, набранного пользователем всем

private void btnSend_Click(object sender, EventArgs e)

{

try

{

//Fill the info for the message to be send

Data msgToSend = new Data();

msgToSend.strName = strName;

msgToSend.strMessage = txtMessage.Text;

msgToSend.cmdCommand = Command.Message;

byte [] byteData = msgToSend.ToByte();

//Send it to the server

clientSocket.BeginSend (byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnSend), null);

txtMessage.Text = null;

}

catch (Exception)

{

MessageBox.Show("Unable to send message to the server.", "SGSclientTCP: " + strName, MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

  1. Реакция на отправку

private void OnSend(IAsyncResult ar)

{

try

{

clientSocket.EndSend(ar);

}

catch (ObjectDisposedException)

{ }

catch (Exception ex)

{

MessageBox.Show(ex.Message, "SGSclientTCP: " + strName, MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

  1. Реакция на получение

private void OnReceive(IAsyncResult ar)

{

try

{

clientSocket.EndReceive(ar);

Data msgReceived = new Data(byteData);

//Accordingly process the message received

switch (msgReceived.cmdCommand)

{

case Command.Login:

lstChatters.Items.Add(msgReceived.strName);

break;

case Command.Logout:

lstChatters.Items.Remove(msgReceived.strName);

break;

case Command.Message:

break;

case Command.List:

lstChatters.Items.AddRange(msgReceived.strMessage.Split('*'));

lstChatters.Items.RemoveAt(lstChatters.Items.Count - 1);

txtChatBox.Text += "<<<" + strName + " has joined the room>>>\r\n";

break;

}

if (msgReceived.strMessage != null && msgReceived.cmdCommand != Command.List)

txtChatBox.Text += msgReceived.strMessage + "\r\n";

byteData = new byte[1024];

clientSocket.BeginReceive(byteData,

0,

byteData.Length,

SocketFlags.None,

new AsyncCallback(OnReceive),

null);

}

catch (ObjectDisposedException)

{ }

catch (Exception ex)

{

MessageBox.Show(ex.Message, "SGSclientTCP: " + strName, MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

  1. Метод, что вызывается при загрузке формы

private void Form1_Load(object sender, EventArgs e)

{

this.Text = "SGSclientTCP: " + strName;

//The user has logged into the system so we now request the server to send

//the names of all users who are in the chat room

Data msgToSend = new Data ();

msgToSend.cmdCommand = Command.List;

msgToSend.strName = strName;

msgToSend.strMessage = null;

byteData = msgToSend.ToByte();

clientSocket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnSend), null);

byteData = new byte[1024];

//Start listening to the data asynchronously

clientSocket.BeginReceive(byteData,

0,

byteData.Length,

SocketFlags.None,

new AsyncCallback(OnReceive),

null);

}

  1. Активация кнопки отправки при изменении текста (набран хоть бы 1 символ для отправки)

private void txtMessage_TextChanged(object sender, EventArgs e)

{

if (txtMessage.Text.Length == 0)

btnSend.Enabled = false;

else

btnSend.Enabled = true;

}

  1. Закрытие формы-клиента

private void SGSClient_FormClosing(object sender, FormClosingEventArgs e)

{

if (MessageBox.Show("Are you sure you want to leave the chat room?", "SGSclient: " + strName,

MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.No)

{

e.Cancel = true;

return;

}

try

{

//Send a message to logout of the server

Data msgToSend = new Data ();

msgToSend.cmdCommand = Command.Logout;

msgToSend.strName = strName;

msgToSend.strMessage = null;

byte[] b = msgToSend.ToByte ();

clientSocket.Send(b, 0, b.Length, SocketFlags.None);

clientSocket.Close();

}

catch (ObjectDisposedException)

{ }

catch (Exception ex)

{

MessageBox.Show(ex.Message, "SGSclientTCP: " + strName, MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

  1. Отправка по кнопке Enter

private void txtMessage_KeyDown(object sender, KeyEventArgs e)

{

if (e.KeyCode == Keys.Enter)

{

btnSend_Click(sender, null);

}

}

  1. Класс данных, с которыми сервер и клиент взаимодействуют друг с другом

class Data

public string strName; //Name by which the client logs into the room

public string strMessage; //Message text

public Command cmdCommand; //Command type (login, logout, send message, etcetera)

  1. Функция-метод, что преобразует структуру данных в массив байтов

public byte[] ToByte()

{

var result = new List<byte>();

//First four are for the Command

result.AddRange(BitConverter.GetBytes((int)cmdCommand));

byte[] bytesText = Encoding.UTF8.GetBytes(strMessage ?? "");

byte[] bytesName = Encoding.UTF8.GetBytes(strName ?? "");

//Add the length of the name

result.AddRange(BitConverter.GetBytes(bytesName.Length));

result.AddRange(BitConverter.GetBytes(bytesText.Length));

//Add the name

result.AddRange(bytesName);

//And, lastly we add the message text to our array of bytes

result.AddRange(bytesText);

return result.ToArray();

}

Результаты работы программы

На рис. 5 - 8 представлен процесс работы программы.

Сначала запускаем серверную часть приложения (рис. 5)

Рис. 5 Серверная часть приложения

Следующей запускаем клиентскую часть, вводим логин и IP адрес (рис. 6).

Рис. 6 Клиентская часть приложения

Результат работы программы с одним пользователем представлен на рис. 7.

Рис. 7 Результат работы программы с одним пользователем

Результат работы программы с двумя пользователями представлен на рис. 8.

Рис. 8 Результат работы программы

В данной главе был разработан программный комплекс «Чат» с использованием технологии клиент-сервер.

Заключение

В данной работе была достигнута поставленная цель: рассмотрена технология «клиент-сервер» в теоретическом аспекте и на практическом примере.

Исходя из цели были решены следующие задачи:

  1. Определено понятие сервера и клиента;
  2. Рассмотрены роль сервера и клиента в архитектуре клиент-сервер;
  3. Определены преимущества архитектуры клиент-сервера;
  4. Определены компоненты архитектуры клиент-сервер
  5. Рассмотрена модели архитектуры клиент-сервер
  6. Определена сущность понятия сетевые протоколы и их виды;
  7. Разработано приложение «Чат» с применением технологи «клиент-сервер».

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

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

Библиография

  1. Дарков, А.В. Информационные технологии: теоретические основы: Учебное пособие / А.В. Дарков, Н.Н. Шапошников. - СПб.: Лань, 2016. - 448 c.
  2. Гаврилов, М.В. Информатика и информационные технологии: Учебник / М.В. Гаврилов, В.А. Климов. - Люберцы: Юрайт, 2016. - 383 c.
  3. Гаврилов, М.В. Информатика и информационные технологии: Учебник для прикладного бакалавриата / М.В. Гаврилов, В.А. Климов. - Люберцы: Юрайт, 2016. - 383 c.
  4. Гагарина, Л.Г. Информационные технологии: Учебное пособие / Л.Г. Гагарина, Я.О. Теплова, Е.Л. Румянцева и др. - М.: Форум, 2018. - 144 c.
  5. Гохберг, Г.С. Информационные технологии: Учебник / Г.С. Гохберг. - М.: Academia, 2018. - 416 c.
  6. Затонский, А.В. Информационные технологии: разраб. информ. модел.: Учебное пособие / А.В. Затонский. - М.: Риор, 2017. - 384 c.
  7. Зиборов, В. Visual C# 2012 на примерах / В. Зиборов. - М.: БХВ-Петербург, 2016. - 334c.
  8. Информационные системы и технологии / Под ред. Тельнова Ю.Ф.. - М.: Юнити, 2017. - 544 c.
  9. Информационные системы и технологии: Научное издание. / Под ред. Ю.Ф. Тельнова. - М.: ЮНИТИ, 2016. - 303 c.
  10. Рожков, И.В. Информационные системы и технологии в маркетинге / И.В. Рожков. - М.: Русайнс, 2017. - 320 c.
  11. Рой, Ошероув Искусство автономного тестирования с примерами на С# / Ошероув Рой. - М.: ДМК Пресс, 2016. - 258 c.
  12. Советов, Б.Я. Информационные технологии: теоретические основы: Учебное пособие / Б.Я. Советов, В.В. Цехановский. - СПб.: Лань, 2016. - 448 c.
  13. Чукарин, А.В. Бизнес-процессы и информационные технологии в управлении современной инфокоммуникационной компанией / А.В. Чукарин. - М.: Альпина Паблишер, 2016. - 512 c.
  14. Тюрин, И.В. Вычислительная техника и информационные технологии: Учебное пособие / И.В. Тюрин. - Рн/Д: Феникс, 2018. - 64 c.
  15. Щербакова, Т.Ф. Вычислительная техника и информационные технологии: учебное пособие / Т.Ф. Щербакова. - М.: Academia, 2017. - 288 c.