Технология удаленного доступа к объектам Remoting 2. Распределенные приложения Распределенное приложение — это приложение, в котором обработка происходит на двух или нескольких компьютерах, а, значит, и обрабатываемые данные также являются распределенными. Современная технология распределенных приложений должна быть эффективной, расширяемой, поддерживающей транзакции, позволяющей взаимодействовать с другими технологиями, обладающей большими возможностями настройки, поддерживать работу в Интернет и т. д. 3. Виды распределенных архитектур Модульное программирование Клиент-серверные (двухуровневые) архитектуры Многоуровневые архитектуры Одноранговые архитектуры 4. Модульное программирование Один из фундаментальных приемов ограничения сложности - разделение кода на отдельные части по функциональному назначению. Такой прием можно применять на разных уровнях путем объединения кода в процедуры, процедур в классы, классов компоненты, и т.д. Распределенные приложения не только получили большие преимущества от использования данной концепции, но и помогают обеспечить ее применение, так как модульность необходима для распределения кода по разным компьютерам. Фактически основные категории распределенных архитектур различаются степенью ответственности, возлагаемой на отдельные модули, и способами их взаимодействия. 5. Клиент-серверные архитектуры Клиент-сервер — это наиболее ранняя и фундаментальная из распределенных архитектур. В широком смысле это просто клиентский процесс, запрашивающей обслуживание у серверного процесса. Обычно клиентский процесс отвечает за уровень представления (или пользовательский интерфейс). На этом уровне выполняется проверка введенных пользователем данных, выполнение вызова сервера и применение некоторых бизнес-правил. Сервер выступает в качестве механизма исполнения клиентских запросов путем применения прикладных алгоритмов и взаимодействия с такими ресурсами, как базы данных и файловые системы. Очень часто у одного сервера бывает много клиентов. Следует отметить, что роли клиента и сервера в общем случае не обязательно исполняются разными компьютерами. 6. Многоуровневые архитектуры Обычно двухуровневые архитектуры легко реализуемы, но имеют проблемы масштабируемости. В трехуровневых архитектурах для решения различных задач используется промежуточный уровень. Уровень представления Приложение Windows Forms Бизнес-уровень Уровень данных Объект Бизнес-правило Объект доступа к данным БД Объект доступа к данным Internet Explorer Объект Бизнес-правило Объект доступа к данным БД 7. Одноранговые архитектуры В некоторых случаях целесообразно использовать модель более тесного взаимодействия, в которой границы между клиентом и сервером размыты. Подобная организация применяется в сценариях рабочих групп, так как основная задача подобных распределенных приложений — совместное использование информации и средств обработки, Исключительно одноранговая (peer-to-peer) среда состоит из множества отдельных узлов без центрального сервера. В отсутствие общеизвестного (well-known) главного сервера необходим механизм, позволяющий узлам отыскивать друг друга. Обычно для этого используются приемы на основе широковещательных сообщений или некоторые предопределенные параметры конфигурации. 8. Одноранговая архитектура Узел Узел Узел Узел 9. Преимущества распределенных приложений Отказоустойчивость (система должна сохранять работоспособность при сбоях в ней. При построении отказоустойчивой системы применяют избыточность. Распределение копий функциональных модулей по разным узлам повышает вероятность того, что сбой одного узла не повлияет на избыточные объекты, на других узлах); Масштабируемость - это способность системы выдерживать увеличивающуюся нагрузку лишь с небольшим снижением производительности (Достигается путем распределения разных функциональных частей приложения по разным узлам. ); Администрирование - управление аппаратной и программной конфигурацией большой сети ПК (Наиболее удобный вариант - перенести наиболее часто изменяющиеся программы в централизованное хранилище и обеспечить к нему удаленный доступ). 10. Архитектура Remoting Рассмотрим архитектуру, которая позволяет клиенту связываться с удаленным объектом. Когда клиент создает экземпляр удаленного объекта, то он получает заместителя (прокси) для доступа к объекту вместо самого объекта. Прокси предоставляет такой же интерфейс, как и реальный объект. Когда клиент вызывает метод или получает доступ к полю или свойству прокси, то за передачу запроса к удаленному объекту отвечает прокси. 11. Инфраструктура Remoting состоит из четырех главных компонентов: Рабочая среда Remoting – отвечает за динамическое создание прокси от имени клиента. Она также выполняет инициализацию подходящего канала связи на сервере, предназначенного для ожидания входящих запросов. Прокси - Прокси-объект отвечает за получение пользовательских вызовов метода. Как только получен такой вызов, прокси обеспечивает получение помощи от подходящего форматера и транспорт для передачи параметров удаленному объекту. 12. Средство форматирования (форматтер)отвечает за сериализацию параметров в формат, подходящий для передачи. Remoting поставляется в комплекте с двумя форматтерами 0 двоичным и SOAP. Канал связи – обеспечивает пересылку сообщений между клиентом и сервером. Канал связи со стороны клиента отвечает за посылку сообщения с помощью назначенного транспортного протокола. Канал связи со стороны сервера осуществляет мониторинг входящих сообщений и передачу этих сообщений подходящему форматтеру. Remoting поставляется с двумя каналами связи – TCP и HTTP. 13. Инфраструктура Remoting 14. Этапы создания распределенного приложения Создание интерфейса (.dll); Реализация интерфейса (.dll); Создание сервера; Создание клиента. 15. Создание интерфейса File / New / Project / ClassLibrary 16. Программный код интерфейса (проект Interface1) using System; namespace Interface1 { public interface MyInterface { string method1(); string method2(); } } 17. Создание интерфейса Откомпилировать проект; В каталоге /bin/Debug появляется файл Interface1.dll 18. Реализация интерфейса Интерфейс реализуется в тестируемом объекте (проект Object1); Для создание проекта используется dll: File / New/ Project / ClassLibrary В каталог bin/Debug копируется файл Interface1.dll; В окне проекта Solution Explorer добавляются ссылки (add References) на Interface1.dll (через Browse…) и System.Runtime.Remoting. 19. Подключение ссылок 20. Программный код тестируемого объекта (проект Object1) using System; using Interface1; namespace Object1 { public class MyObject: MarshalByRefObject, MyInterface { public string method1() { return "method1"; } public string method2() {return "method2";} }} Тип, передаваемый по ссылке Иногда необходимо, чтобы все вызовы объекта, созданного в некотором домене приложения, обращались именно к экземпляру в данном домене, а не к его копии в другом домене. Например, объекту могут требоваться ресурсы, доступные только объектам, исполняющимся на данном компьютере. В этих случаях используются типы, передаваемые по ссылке, для которых инфраструктура ,NET Remoting передает ссылку на экземпляр объекта, а не его сериализованную копию. .NET Framework требует, чтобы типы, передаваемые по ссылке, наследовали от System.MarshatByRefObject. Простое наследование от этого класса обеспечивает возможность удаленного доступа к экземплярам производного типа Объявление типа, передаваемого по ссылке: class SomeMBRType : MarshatByRefObject { … } 22. Реализация интерфейса(создание тестируемого объекта) Откомпилировать проект Object1; В каталоге /bin/Debug появляется файл Object1.dll наряду с файлом Interface1.dll 23. Создание сервера Создать проект-приложение (WindowsApplication) MyServer; Скопировать в каталог /bin/Debug файлы Object1.dll и Interface1.dll; В окне проекта Solution Explorer добавить ссылки (add References) на Interface1.dll, Object1.dll и System.Runtime.Remoting. 24. Запуск программы-сервера 25. Программный код сервера using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using Interface1; using Object1; 26. Кнопка Start System.Runtime.Remoting.Channels.Tcp.TcpC hannel channel=new TcpChannel(8080); Object1.MyObject obj=new MyObject(); System.Runtime.Remoting.RemotingServices. Marshal(obj,"object"); 27. Типы каналов Remoting предоставляет два типа каналов: • HttpChannel ; • TcpChannel; Хотя их общая структура похожа, они отличаются транспортом, используемым для передачи сообщений, HTTP и TCP способны обеспечить транспорт в большинстве случаев, однако иногда может возникать необходимость применения других транспортов. Например, когда требуется доступ к удаленным объектам с беспроводного устройства, использующего протокол WAP (Wireless Application Protocol). 28. Кнопка Stop Application.Exit(); 29. Создание клиента Создать проект-приложение MyClient; Скопировать в каталог /bin/Debug файл Interface1.dll; В окне проекта Solution Explorer добавить ссылки (add References) на Interface1.dll (через Browse…) и System.Runtime.Remoting. 30. Программный код клиента … using System.Runtime.Remoting; using Interface1; … private void button1_Click(object sender, System.EventArgs e) { MyInterface ob= (MyInterface)Activator.GetObject( typeof(MyInterface), "tcp://127.0.0.1:8080/object"); } this.textBox1.Text=ob.method1(); this.textBox2.Text=ob.method2(); 31. Переопределение метода в Object public string method1(string us, string pw) { System.Data.SqlClient.SqlConnection sqlConnection1=new System.Data.SqlClient.SqlConnection(); System.Data.SqlClient.SqlCommand sqlCommand1 = new System.Data.SqlClient.SqlCommand(); // sqlConnection1 sqlConnection1.ConnectionString = "workstation id=\"HOME-VBQ94BWURG\";packet size=4096;integrated security=SSPI;initia" + "l catalog=usera;persist security info=False"; 32. Переопределение метода в Object // sqlCommand1 sqlCommand1.CommandText = "proc_user"; sqlCommand1.CommandType = System.Data.CommandType.StoredProcedure; sqlCommand1.Connection = sqlConnection1; sqlCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@us", System.Data.SqlDbType.VarChar, 20)); sqlCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@pw", System.Data.SqlDbType.VarChar, 10)); sqlCommand1.Parameters.Add(new System.Data.SqlClient.SqlParameter("@fam", System.Data.SqlDbType.VarChar, 20, System.Data.ParameterDirection.Output, false, ((System.Byte)(0)), ((System.Byte)(0)), "", System.Data.DataRowVersion.Current, null)); 33. Переопределение метода в Object try { sqlConnection1.Open(); sqlCommand1.Parameters["@us"].Value=us; sqlCommand1.Parameters["@pw"].Value=pw; sqlCommand1.ExecuteNonQuery(); string res=sqlCommand1.Parameters["@fam"].Value. ToString(); 34. Переопределение метода в Object if (res!="") return res; else return "Доступа нет"; } catch(Exception ex) { return ex.Message; } 35. Изменения в программу-клиент 36. Кнопка Подключиться к объекту Interface1.MyInterface ob=(MyInterface)Activator.GetObject(typeof(MyIn terface),"tcp://127.0.0.1:8080/object"); try { this.label1.Text=ob.method1( this.textBox1.Text.ToString(), this.textBox2.Text.ToString()); } catch(Exception ex) { this.label1.Text="no"+ex.Message; } 37. Использование двух интерфейсов Создание интерфейса Interface2 using System; namespace Interface2 { public interface MyInterface2 { string method22(); } } 38. Использование двух интерфейсов Добавления в Object1 using System; using Interface1; using Interface2; … public class MyObject:MarshalByRefObject,MyInterface,MyInte rface2 {… public string method22() { return "privet from interface2 Object1"; } } 39. Использование двух интерфейсов Добавления в MyClient using System.Runtime.Remoting; using Interface1; using Interface2; … Interface1.MyInterface ob=(MyInterface)Activator.GetObject(typeof(MyIn terface),"tcp://127.0.0.1:8080/object"); Interface2.MyInterface2 ob2=(MyInterface2)Activator.GetObject(typeof(My Interface2),"tcp://127.0.0.1:8080/object"); … this.label4.Text=ob2.method22(); 40. Использование различных реализаций (объектов) Создание Object2 using System; using Interface2; namespace Object2 { public class MyObject2:MarshalByRefObject,MyInterface2 { } } public string method22() { return "privet from object2"; } 41. Использование различных реализаций (объектов) Добавления в MyServer using Interface1; using Interface2; using Object1; using Object2; … System.Runtime.Remoting.Channels.Tcp.TcpChannel channel=new TcpChannel(8080); Object1.MyObject obj=new MyObject(); System.Runtime.Remoting.RemotingServices.Marsh al(obj,"object"); Object2.MyObject2 obj2=new MyObject2(); System.Runtime.Remoting.RemotingServices.Marsh al(obj2,"object2"); 42. Использование различных реализаций (объектов) Добавления в MyClient Interface1.MyInterface ob=(MyInterface)Activator.GetObject(typeof(MyIn terface),"tcp://127.0.0.1:8080/object"); Interface2.MyInterface2 ob2=(MyInterface2)Activator.GetObject(typeof(My Interface2),"tcp://127.0.0.1:8080/object"); Interface2.MyInterface2 ob22=(MyInterface2)Activator.GetObject(typeof( MyInterface2),"tcp://127.0.0.1:8080/object2"); 43. Использование различных реализаций (объектов) Добавления в MyClient Method1 определен в Interface1, реализован в Object1 this.label1.Text=ob.method1{“login”,”passw ord”); Method22 определен в Interface2, реализован в Object1 this.label4.Text=ob2.method22(); Method22 определен в Interface2, реализован в Object2 this.label5.Text=ob22.method22();