Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций РСОИ.doc
Скачиваний:
20
Добавлен:
04.11.2018
Размер:
1.93 Mб
Скачать

3.2.1. Створення системи клієнт-сервер на основі технології Remoting

Remoting-сервер. Розглянемо створення простого Remoting-сервера на прикладі простого time-сервера. Для цього необхідно створити новий проект і додати інтерфейс віддаленого класу:

using System;

public interface IRemoteTime

{

DateTime CurrentTime {get;}

}

Скомпілюємо його в окрему збірку. Вона знадобиться як на сервері, так і на клієнтові.

Примітка. Зверніть увагу на те, що використовується інтерфейс. Річ у тому, що на стороні клієнта необхідні метадані віддаленого об’єкту. Можна обійтися без інтерфейсу, але тоді на стороні клієнта доведеться мати копію збірки, що містить серверний клас.

Порада. Неможливо безпосередньо створити об'єкти, що активуються клієнтом, не маючи коду самого об'єкту, а тільки його інтерфейс. Проте можна зажадати від об’єкту, що активується сервером, його активатор, який і повертатиме посилання. Використовуючи такий підхід, можна працювати тільки з об’єктуми, що передаються за посиланням.

Окрім інтерфейсу, можна також використовувати клас із співпадаючими публічними порожніми методами, що успадкований від MarshalByRefObject. Створити такий клас можна утилітою soapsuds з ключем -nowp. У цьому випадку для створення віддалених об'єктів можна використовувати оператор new.

У прикладі будемо використовувати передавання за посиланням. Нижче наведено реалізацію інтерфейсу та серверного застосунка.

//реалізація інтерфейсу

using System;

public class RemoteTime: MarshalByRefObject, IRemoteTime

{

public DateTime CurrentTime

{

get { return DateTime.Now; }

}

}

//реалізація сервера

using System;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Http;

public class SimpleServer;

{

static void Main()

{

ChannelServices.RegisterChannel(new HttpChannel(888)); //1

RemotingConfiguration.RegisterWellKnownServiceType(

typeof(RemoteTime),

"RemoteTimeHost/rt",

WellKnownObjectMode.Singleton); //2

Console.WriteLine("Remote time host is running.");

Console.WriteLine("Press ENTER to exit");

Console.ReadLine();

}

}

Розглянемо вищенаведений код докладніше. Рядок, помзначений одиницею реєструє Httpchannel 888 – це номер http-порту, який прослуховуватиметься сервером.

Рядок, помзначений двійкою, вказує серверу зареєструвати Remotetime як server activated Singleton-об'єкт, і повідомляє url, за яким він буде доступний. Повний url об'єкту буде таким: <http://server_name:888/remotetimehost/rt>.

Існує ще один спосіб створення каналу і реєстрації об'єктів. Замість динамічного налаштування параметрів у коді застосунка можна дописати секцію у файл конфігурації (application.exe.config або web.config):

<configuration>

<system.runtime.remoting>

<application>

<service>

<wellknown

mode="Singleton"

type="ServiceClass, ServiceClassAssemblyName"

objectUri="ServiceClass.rem"

/>

</service>

<channels>

<channel

name="MyChannel"

priority="100"

ref="http"

/>

</channels>

</application>

</system.runtime.remoting>

</configuration>

При цьому objectUrl повинен закінчуватися на .rem або .soap, щоб IIS зрозумів (у разі його використання), що треба запустити фільтр ASP.NET. При зверненні до сторінок із розширенням rem або soap фільтр передасть їх механізму Remoting.

Попередження. Для роботи застосунка, який конфігурує, необхідно, щоб у SecurityРermission був встановлений прапор RemotingСonfiguration. Будьте уважні – в .Net Framework redistributable цей прапорець за замовчуванням не встановлений. Налаштування захисту .NET застосунків можна також задати за допомогою «Microsoft .NET Framework Wizards», який можна знайти у «Programs\Administrative Tools».

Клієнт. Тепер розглянемо реалізацію клієнтської збірки розробленого Remoting-сервера:

using System;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Http;

public class SingleClient

{

static void Main()

{

IRemoteTime rt = (IRemoteTime)Activator.GetObject(

typeof(IRemoteTime),

"http://server_name:888/RemoteTimeHost/rt");

Console.WriteLine("Current time is : {0}",rt.CurrentTime);

}

}

На клієнті за допомогою статичного методу GetОbject класу Activator створюємо проксі віддаленого об'єкту, викликаємо його метод, результат виводиться на консоль.

Контрольні запитання та завдання:

  1. Назвіть базові концепції технології .NET Remoting.

  2. Опишіть каркас віддаленої взаємодії .NET.

  3. Для чого призначені агенти, повідомлення, канали та форматери в .NET Remoting?

  4. Як здійснюється передавання об’єктів клієнтові?

  5. Опишіть процес розроблення клієнт-серверної системи з використанням .NET Remoting..