Динамическая связь приложений через библиотеку классов

Порядок работы с динамически связанными приложениями, когда одно приложение способно и может передавать данные в другое приложение. Создание библиотеки классов удалённого объекта: клиент (приложение Windows Forms) и сервер (консольное приложение).

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 11.04.2017
Размер файла 2,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Лабораторная работа

на тему: Динамическая связь приложений через библиотеку классов

Содержание

1. Вводная часть

2. Удалённый объект: создание библиотеки классов удалённого объекта

3. Клиент: создание приложения Windows Forms

4. Сервер: создание консольного приложения

5. Завершающая часть

6. О приложении к Лабораторной работе

1. Вводная часть

В этой работе будет рассмотрена работа с динамически связанными приложениями. Нас интересует именно те случаи, когда одно приложение способно и может при необходимости передавать данные в другое приложение, причём оба приложения запущены в один и тот же момент и для передачи данных не используются временные файла на жёстком диске. Фактически приложения будут общаться друг с другом словно клиент и сервер. То есть это общение будет аналогично общению между удалёнными машинами (через протоколы HTTP, FTP или TELNET). Для реализации данной функциональности лучше всего использоваться так называемые «каналы».

Для чего может понадобится подобное? Динамическая связь приложений как удалённо, так и на локальной машине удобна для передачи малых объёмов информации. При этом данные передаются по защищённому каналу (данные можно предварительно зашифровать тем же MD5-хэшем). Также, такая связь приложений не оставляет лишнего «мусора» изначально. А также, возможно реализовать удалённое взаимодействие клиента и сервера.

Что такое каналы?

Каналы используются инфраструктурой удалённого взаимодействия платформы .NET Framework для передачи удаленных вызовов. Если клиент вызывает удаленный объект, вызов «сериализуется» (перевод структуры данных в последовательность битов) в сообщение, которое отправляется по клиентскому каналу, а получается по каналу сервера. После получения сообщения, оно «десериализуется» и обрабатывается. Возвращаемые значения передаются по каналу сервера, а их получение производится по каналу клиента.

Класс IpcChannel является удобным классом, в котором сочетаются функциональные возможности класса IpcClientChannel и класса IpcServerChannel.

Для работы с каналами нам потребуются следующие пространства имён:

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

Пространство имён: System.Runtime.Remoting.Channels.Ipc;

Сборка: System.Runtime.Remoting (в System.Runtime.Remoting.dll).

2. А также основные пространства имён:

System.Runtime.Remoting;

System.Runtime.Remoting.Channels;

Что такое IPC ?

Межпроцессное взаимодействие (Inter-Process Communication, IPC) -- набор способов обмена данными между множеством потоков в одном или более процессах. Процессы могут быть запущены на одном или более компьютерах, связанных между собой сетью. IPC-способы делятся на методы обмена сообщениями, синхронизации, разделяемой памяти и удалённых вызовов (RPC). Методы IPC зависят от пропускной способности и задержки взаимодействия между потоками и типа передаваемых данных.

IPC также может упоминаться как межпотоковое взаимодействие (inter-thread communication), межпоточное взаимодействие и межпрограммное взаимодействие (inter-application communication). IPC наряду с концепцией адресного пространства является основой для разграничения адресного пространства.

Что будет представлять собой приложение, разрабатываемое в данной работе ? Первое приложение будет представлять собой окно пустое Windows Forms. Так будет реализован клиент. Реализация сервера будет в виде консольного окна. Удалённый объект будет сформирован в виде библиотеки классов. Всего три проекта и три готовых объекта, два из которых -- приложения.

2. Удалённый объект: создание библиотеки классов удалённого объекта

Запускаем Visual Studio 2010, откроется Начальная страница:

Для начала, надо создать первый проект, для этого выполним последовательно: Файл -> Создать -> Проект… (также можно просто нажать сочетание клавиш Ctrl+Shift+N или пункт «Создать проект…» на Начальной странице):

Рис. 2.1 Создание нового проекта

Выберем слева в пункте Установленные шаблоны язык Visual C#, далее найдём в списке Библиотека классов. Также здесь можно выбрать какой использовать «фреймворк» (набора компонентов для написания программ). В нашем случае выберем .NET Framework 4.

Рис. 2.2 Окно создания нового проекта

В поле Имя вводим LWP11-RemoteObject -- это название программы (выбрано по названию лабораторного практикума, номеру и названию работы, через тире в названии обозначаем принадлежность будущего приложения). В поле Расположение указана конечная директория, где будет находиться весь проект. Выберем расположение удобное для быстрого поиска. В поле Имя решения вводится либо название программы «по умолчанию» из поля Имя автоматически, либо можно ввести своё собственное. Под этим именем будет создана конечная папка проекта (если Имя и Имя решения разные).

Рис. 2.3 Вводим данные нового проекта библиотеки классов

После нажатия клавиши ОК мы увидим сформированный проект и исходный код библиотеки классов (не пустой изначально).

Рис. 2.4 Обозреватель решений: состав проекта библиотеки классов сформированного средой разработки

Теперь, можно откомпилировать созданную программу, нажав клавишу F6 (Построение -> Построить решение). Тем самым мы собираем библиотеку в DLL-файл (и производим компиляцию debug-версии библиотеки) (Debug выбрано изначально).

Рис. 2.5 Скомпилированная библиотека классов по конфигурации Debug

Теперь вставим место всего кода единственного файла Class1.cs следующий код:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LWP11_RemoteObject

{

public interface IRemoteSend1

{

void Send(int x, int y);

}

public interface IRemoteSend2

{

void Send(int x, string y);

}

}

Сам файл Class1.cs переименуем в LWP11RO.cs. Для переименования необходимо выделить файл в обозревателе решений, далее нажать F2 на клавиатуре, либо щёлкнуть правой кнопкой мыши на файле, далее в выпадающем списке найти Переименовать.

«Перестроим» нашу библиотеку, нажав клавишу F6 (Построение -> Построить решение) но уже по конфигурации Release (для этого выбираем другую конфигурацию: в выпадающем списке Конфигурация решения). Тем самым мы собираем библиотеку в DLL-файл (и производим компиляцию уже release-версии библиотеки).

Найдём откомпилированную библиотеку классов и поместим её в любое удобное место на диске (для последующего быстрого поиска).

3. Клиент: создание приложения Windows Forms

Снова запускаем Visual Studio 2010, откроется Начальная страница:

Для начала, надо создать проект, для этого выполним последовательно: Файл -> Создать -> Проект… (также можно просто нажать сочетание клавиш Ctrl+Shift+N или пункт «Создать проект…» на Начальной странице).

Выберем слева в пункте Установленные шаблоны язык Visual C#, далее найдём в списке Приложение Windows Forms. Также здесь можно выбрать какой использовать «фреймворк» (набора компонентов для написания программ). В нашем случае выберем .NET Framework 4.

В поле Имя вводим LWP11-Client -- это название программы (выбрано по названию лабораторного практикума, номеру и названию работы, через тире в названии обозначаем принадлежность будущего приложения). В поле Расположение указана конечная директория, где будет находиться весь проект. Выберем расположение удобное для быстрого поиска. В поле Имя решения вводится либо название программы «по умолчанию» из поля Имя автоматически, либо можно ввести своё собственное. Под этим именем будет создана конечная папка проекта (если Имя и Имя решения разные).

Рис. 3.1 Вводим данные нового проекта приложения Windows Forms

После нажатия клавиши ОК мы увидим сформированный проект и исходный код приложения Windows Forms (не пустого изначально).

Рис. 3.2 Обозреватель решений: состав проекта приложения Windows Forms сформированного средой разработки

Теперь, можно откомпилировать созданную программу, нажав клавишу F5 (Отладка -> Начать отладку или нажав на иконку . Тем самым мы запускаем приложение в режиме отладки (и производим компиляцию debug-версии программы) (Debug выбрано изначально).

Рис. 3.3 Запуск приложения Windows Forms по конфигурации Debug

Модифицируем приложение. Для начала изменим размер нашей единственной формы. Для этого можно потянуть за уголок в нужном направлении на странице визуального представления формы1. Но также размер можно менять на панели свойств этой формы. Для этого нужно поменять значение размера в пикселях (высоту и ширину) в поле Size.

ПРИМЕЧАНИЕ № 1: Для перехода на визуальное представление формы, необходимо двойным нажатием в обозревателе решений нажать на значок формы () или выбрать вкладку на панели вкладок с именем <имя формы>.cs [Конструктор].

Задаём следующие параметры формы на панели Свойства:

(Name)

изменим с Form1.cs2 на LWP11Main

^ Поменяем внутреннее имя формы.

Text

изменим с Form1 на Динамическая связь приложений (C#) :: Клиент

^ Поменяем заголовок формы (то что отображается в шапке приложения слева).

Icon

изменим изображение (иконку) приложения

^ Необходим файл значка *.ico.

Size

изменим со значений 300; 300 на 500; 200

^ Поменяем размер формы.

ПРИМЕЧАНИЕ № 2: Для того, чтобы поменять имя файла нашей формы, необходимо выполнить следующее: выделить в обозревателе решений значок формы () и нажать правую кнопку мыши, затем выбрать Переименовать. Ввести необходимое новое имя СОХРАНЯЯ расширение *.cs. После смены имени, автоматически поменяются имена проассоциированных непосредственно с формой файлов:

Получим нечто подобное:

Рис. 3.4. Модифицированная форма приложения

Теперь необходимо добавить удалённый объект в качестве Ссылки. Выполним: Проект -> Добавить ссылку, либо ПКМ на Ссылки в обозревателе решений, далее Добавить ссылку...:

В открывшемся окне перейдём на вкладку Обзор, укажем путь к библиотеке классов, которую мы уже скомпилировали:

Рис. 3.5 Добавить ссылку: выбор нужного объекта, а именно ранее скомпилированной библиотеки классов: LWP11-RemoteObject.dll

Жмём ОК. Удалённый объект добавлен в наше приложение и теперь можно работать с классами, предоставленными этим объектом:

Теперь приступим к формированию элементов и их функциональности. Для начала расставим элементы как показано на рисунке ниже:

Рис. 3.6 Расстановка элементов на форме (на форме LWP11Main проекте LWP11-Client)

Здесь два простых TextBox и два Label.

По порядку распишем Свойства каждого элемента:

TextBox:

(Name):

TB_1

Size:

30; 20

TextBox:

(Name):

TB_2

Size:

30; 20

Теперь отправляемся в код формы (правая кнопка мыши на значке формы, далее Перейти к коду или нажмём на клавишу F7):

В самое начало кода добавим:

using LWP11_RemoteObject; // Подключаем объект

Найдём:

public partial class LWP11Main : Form

{

Добавим после:

// Переменная для объекта

private IRemoteSend1 _rs1;

private IRemoteSend2 _rs2;

Событие KeyPress верхнего TextBox:

private void TB_1_KeyPress(object sender, KeyPressEventArgs e)

{

// Введённые символы должны быть только цифрами, иначе ввода не будет (символ не введётся)

if (!Char.IsDigit(e.KeyChar))

{ динамический связь клиент сервер

e.Handled = true;

}

}

Событие KeyPress нижнего TextBox:

private void TB_2_KeyPress(object sender, KeyPressEventArgs e)

{

// Введённые символы должны быть только буквами, иначе ввода не будет (символ не введётся)

if (!Char.IsLetter(e.KeyChar))

{

e.Handled = true;

}

}

Событие MouseClick формы LWP11Main:

private void LWP11Main_MouseClick(object sender, MouseEventArgs e)

{

// Получаем объект

_rs1 = (IRemoteSend1)Activator.GetObject(typeof(IRemoteSend1), "ipc://4567/RemoteSend1.rem"); // Открываем первый канал

// Передаём координаты нажатия ЛКМ

try

{

_rs1.Send(e.X, e.Y);

}

catch { }

}

Последнее событие TextChanged нижнего TextBox:

private void TB_2_TextChanged(object sender, EventArgs e)

{

// Получаем объект

_rs2 = (IRemoteSend2)Activator.GetObject(typeof(IRemoteSend2), "ipc://4567/RemoteSend2.rem"); // Открываем первый канал

// Передаём данные из TextBox

try

{

_rs2.Send(Convert.ToInt16(TB_1.Text), TB_2.Text);

}

catch { }

}

Компилируем приложение (Release) и запускаем. Проверяем работоспособность текстовых полей. Вводим в верхнее только цифры, в нижнее только буквы:

Рис. 3.7 Окончательная работа приложения-клиента (LWP11-Client.exe)

4. Сервер: создание консольного приложения

Снова запускаем Visual Studio 2010, откроется Начальная страница:

Для начала, надо создать проект, для этого выполним последовательно: Файл -> Создать -> Проект… (также можно просто нажать сочетание клавиш Ctrl+Shift+N или пункт «Создать проект…» на Начальной странице).

Выберем слева в пункте Установленные шаблоны язык Visual C#, далее найдём в списке Консольное приложение. Также здесь можно выбрать какой использовать «фреймворк» (набора компонентов для написания программ). В нашем случае выберем .NET Framework 4.

В поле Имя вводим LWP11-Server -- это название программы (выбрано по названию лабораторного практикума, номеру и названию работы, через тире в названии обозначаем принадлежность будущего приложения). В поле Расположение указана конечная директория, где будет находиться весь проект. Выберем расположение удобное для быстрого поиска. В поле Имя решения вводится либо название программы «по умолчанию» из поля Имя автоматически, либо можно ввести своё собственное. Под этим именем будет создана конечная папка проекта (если Имя и Имя решения разные).

Рис. 4.1 Вводим данные нового проекта консольного приложения

После нажатия клавиши ОК мы увидим сформированный проект и исходный код консольного приложения (не пустого изначально).

Рис. 4.2 Обозреватель решений: состав проекта приложения Windows Forms сформированного средой разработки

Теперь, можно откомпилировать созданную программу, нажав клавишу F5 (Отладка -> Начать отладку или нажав на иконку . Тем самым мы запускаем приложение в режиме отладки (и производим компиляцию debug-версии программы) (Debug выбрано изначально). При первом запуске пустого консольного приложения, окно появится и сразу же исчезнет. Теперь необходимо добавить удалённый объект в качестве Ссылки. Выполним: Проект -> Добавить ссылку, либо ПКМ на Ссылки в обозревателе решений, далее Добавить ссылку....

В открывшемся окне перейдём на вкладку Обзор, укажем путь к библиотеке классов, которую мы уже скомпилировали:

Рис. 4.3 Добавить ссылку: выбор нужного объекта, а именно ранее скомпилированной библиотеки классов: LWP11-RemoteObject.dll

Жмём ОК. Удалённый объект добавлен в наше приложение и теперь можно работать с классами, предоставленными этим объектом:

Также, необходимо добавить в качестве ссылки ещё один объект (вкладка .NET): System.Runtime.Remoting:

Рис. 4.4 Добавить ссылку: добавление ссылки System.Runtime.Remoting

Модифицируем код консольного приложения. В самом начале добавим следующие строчки:

using LWP11_RemoteObject;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Ipc;

Непосредственно главную функцию, метод Main() изменим следующим образом:

static void Main(string[] args)

{

Console.Title = "Динамическая связь приложений (C#) :: Сервер";

Console.WriteLine("Динамическая связь приложений (C#) :: Сервер");

// Регистрируем канал № 4567

var ipcChannel = new IpcChannel("4567");

ChannelServices.RegisterChannel(ipcChannel, false);

// Получаем данные по каналам

RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteSend1), "RemoteSend1.rem", WellKnownObjectMode.Singleton);

RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteSend2), "RemoteSend2.rem", WellKnownObjectMode.Singleton);

Console.WriteLine("\nНажмите Enter для выхода из приложения...\n\nДанные полученные по каналам:\n\t");

Console.ReadLine();

}

Осталось только добавить два новых класса, реализующих функции получения данных от клиента. Реализуем их в одном файле. Для этого добавим новый файл в наш проект (Проект -> Добавить новый элемент..., либо нажать сочетание клавиш Ctrl+Shift+A). В открывшемся окне выберем Класс, в качестве имени укажем RemoteSend.cs:

Рис. 4.5 Добавление нового элемента: Класс с именем RemoteSend.cs

Изменим весь код нового файла класса следующим образом:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using LWP11_RemoteObject;

namespace LWP11_Server

{

class RemoteSend1 : MarshalByRefObject, IRemoteSend1

{

public void Send(int x, int y)

{

Console.ForegroundColor = ConsoleColor.DarkGreen;

Console.WriteLine("\tX = {0}, Y = {1}", x, y);

}

}

class RemoteSend2 : MarshalByRefObject, IRemoteSend2

{

public void Send(int x, string y)

{

Console.ForegroundColor = ConsoleColor.DarkRed;

Console.WriteLine("\tTB_1.Text = {0}, TB_2.Text = {1}", x, y);

}

}

}

Компилируем приложение (Release) и запускаем.

Рис. 4.7 Окончательная работа приложения-сервера (LWP11-Server.exe)

5. Завершающая часть

Теперь запускаем только приложение-клиент и приложение-сервер. Щёлкаем на любом место формы клиента, а также вводим числом и букву в текстовые поля. Сервер будет «ловить» все щелчки по форме клиента (левой кнопкой мыши), а также изменения текста в «буквенном» текстовом поле (после изменения, значения двух текстовых полей будут переданы серверу). Результат действий видим в окне консоли сервера. Результат работы показан ниже (Рис. 5. 1):

Рис. 5.1 Динамическая связь приложений: результат работы приложения-клиента (сверху) и приложения-сервера (снизу)

6. О приложении к Лабораторной работе № 11

Получившиеся программы (LWP11-Server.exe и LWP11-Client.exe), собранные из кусков кода приведённых в данной лабораторной работе, а также DLL-файл для удалённого объекта (LWP11-RemoteObject.dll) можно загрузить по ссылке в конце этого материала.

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.