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

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 01.04.2023

Просмотров: 234

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

{