Top Banner
МАИ, каф 806, Сети ЭВМ Технология взаимодействия .NET REMOTING 1
35

МАИ, Сети ЭВМ, Лекция №4

Jul 07, 2015

Download

Education

Dima Dzuba

Построение взаимодействия с помощью .NET Remoting и Java RMI.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Технология взаимодействия

.NET REMOTING

1

Page 2: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ2

.NET Remoting

Средство взаимодействие .NET приложений;

Позволяет реализовывать распределенные приложения «не задумываясь» о реализации

алгоритмов сетевого обмена;

Имеет архитектуру клиент-сервер;

Может работать поверх разных протоколов (channel). Сейчас существует поддержка TCP и

HTTP.

TCP - большая скорость;

HTTP - позволяет обойти firewall (работает поверх SOAP);

Дает возможность пересечение границ доменов

.NET Remoting позволяет объектам, исполняющимся внутри разных доменов приложений

и контекстов, взаимодействовать друг с другом через границы .NET Remoting.

С точки зрения инфраструктуры .NET Remoting объекты разделяются на две категории:

дистанцируемые (remotable) и недистанцируемые (nonremotable).

Page 3: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Домены и границы

Домены приложений

Домен приложения можно рассматривать как логический процесс. Мы говорим так потому, что

один процесс Win32 способен содержать более одного домена приложений. Код и объекты,

исполняющиеся в одном домене приложения, не имеют непосредственного доступа к коду и

объектам, исполняющимся в другом домене приложения. Это обеспечивает защиту, так как

сбой в одном домене приложения не влияет на другие домены приложения в том же

процессе. Разделение между доменами приложения формирует границу .NET Remoting.

3

Page 4: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Типы данных

Недистанцируемые типы

Не всякий тип — дистанцируемый. Экземпляры недистанцируемых типов не могут пересекать

границы .NET Remoting ни при каких условиях. При попытке передать экземпляр

недистанцируемого типа другому домену приложения или контексту, инфраструктура .NET

Remoting сгенерирует исключение. Более того, экземплярам объектов, расположенных вне

домена приложения или контекста, содержащего экземпляр объекта недистанцируемого типа,

не удастся получить непосредственный доступ к этому экземпляру.

Дистанцируемые типы

Разные категории дистанцируемых типов либо проникают сквозь границы .NET Remoting,

либо доступны через эти границы. .NET Remoting определяет две категории дистанцируемых

типов: передаваемые по значению (marshal-by-value), передаваемые по ссылке (marshal-by-

reference) .

4

Page 5: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ5

.NET Remoting

Клиент вызывает Proxy на клиентской стороне.

Proxy обращается к транспортному уровню в

соответствии с выбранным каналом.

Данные передаются на сервер.

В зависимости от того как создан сервер

Singlecall или Singleton создается новый

серверный объект или вызывается

существующий.

Результат вызова передается на транспортный

уровень.

Данные передаются на клиент.

В соответствии с выбранным каналом данные

распаковываются.

Proxy возвращает ответ клиенту.

Page 6: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Передача по значению

Экземпляры типов, передаваемых по значению, пересекают границы .NET Remoting с

помощью процесса, известного под названием сериализация. Сериализация — это процесс

представления текущего состояния обьекта в виде последовательности бит.

После того как обьект сериализован, инфраструктура .NET Remoting пересылает полученную

последовательность бит через границы .NET Remoting в другой домен приложения или

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

точную копию первоначального состояния. В .NET тип считается сериализуемым, если он

объявлен с атрибутом Serializable. В следующем фрагменте кода данный атрибут

используется для объявления класса сериализуемым:

[Serializable]

class SomeSerializableClass

6

Page 7: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Передача по ссылке [1/3]

В некоторых случаях передача по значению — это то, что надо. Но иногда необходимо, чтобы

все вызовы объекта, созданного в некотором домене приложения, обращались именно к

экземпляру в данном домене, а не к его копии в другом домене. Например, объекту могут

требоваться ресурсы, доступные только объектам, исполняющимся на данном компьютере. В

этих случаях используются типы, передаваемые по ссылке, для которых инфраструктура

,NET Remoting передает ссылку на экземпляр объекта, а не его сериализооанную копию. .NET

Framework требует, чтобы типы, передаваемые по ссылке, наследовали от

System.MarshatByRefObject. Простое наследование от этого класса обеспечивает

возможность удаленного доступа к экземплярам производного типа. Ниже показан фрагмент

объявления типа, передаваемого по ссылке:

class SomeMBRType : MarshalByRefQbject

7

Page 8: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Передача по ссылке [2/3]

8

приложение №1 приложение №2

алгоритм №1

объект №1заглушка объекта №1

по сети

Page 9: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Передача по ссылке [3/3]

В этих случаях инфраструктура .NET Remoting задействует средства, предоставляемые типом

System.Runtime.Remoting.ObjRef

Маршалинг — это процесс передачи ссылки на объект из одного подразделения .NET

Remoting в другое. Для маршалинга ссылки на объект, передаваемый по ссылке из одного

подразделения в другое, инфраструктура .NET Remoting выполняет следующие действия:

создает экземпляр ObRef, который полностью описывает предаваемый по ссылке

объект;

сериализует ObjRef в виде потока бит;

пересылает сериализованный ObjRef в целевое подразделе-ние .NET Remoting.

При получении сериализованного ObjRef инфраструктура .NET Remoting на принимающей

стороне выполняет следующие действия:

десериализует ObjRef и создает экземпляр класса ObjRef;

по информации из ObjRef создает объект-прокси и, посредством которого клиент может

обращаться к удаленному объекту.

9

Page 10: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ10

.NET Remoting

Выбор приложения-хоста для сервера, которое будет прослушивать выбранный channel.

Service

Console

Win Forms

Выбор различных моделей активации:

SingleCall - объект не хранит состояния и может обработать только один вызов от клиента.

Singleton - к одному объекту могут обращаться различные клиенты.

Клиентская активация

Способы конфигурации сервера:

Конфигурация из кода.

Конфигурация из конфигурационного файла.

Способ представления клиенту информации об интерфейсе.

Интерфейсная DLL

Для HTTP каналов использование soapsuds.exe утилиты Visual Studio для генерации прокси.

• Пример вызова:

SOAPSUDS -url:http://localhost/Trader/StockQuote.soap?wsdl -oa:StockQuote.dll

Page 11: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Серверная активация

RemotingConfiguration.RegisterWellKnownServiceType

В терминах инфраструктуры .NET Remoting типы, активизируемые сервером, называются

общеизвестными (well-known) типами, так как прежде чем активизировать экземпляры

объекта серверное приложение публикует такой тип при помощи общеизвестного URI

(Uniform Resource Identifier). Серверный процесс, в котором находится дистанцируемый тип,

отвечает за конфигурирование данного типа как общеизвестного, публикуя его по

определенным общеизвестным конечным точкам или адресам и активизируя экземпляры

типа только при необходимости. .NET Remoting поддерживает два режима серверной

активизации:

11

Клиент Сервер

Клиент Сервер

Клиент Сервер

Клиент

СерверКлиент

Клиент

Single Call Singleton

Page 12: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Режим Singleton

В отдельный момент времени может быть активен не более чем один экземпляр типа,

сконфигурированного в режиме Singleton.

Единственный экземпляр активизируется при первом обращении к нему клиента в отсутствие

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

запросы, как от того же клиента, так и от других. Экземпляр типа Singleton способен сохранять

состояние в промежутке между вызовами его методов.

Ниже показан пример программного конфигурирования объектного типа в режиме Singleton в

серверном приложении, которое реализует этот дистанцируемый объектный тип:RemotingConfiguration. RegisterWellKnownServiceType(typeof( SomeMBRType ),

"SomeURI", WellKnownObjectMode,Singleton );

Клиент так же должен сконфигурировать SomeMBRType как общеизвестный объект в режиме

Singleton, это показано ниже:RemotingConfiguration.RegisterWellKnownClientType(typeof(SomeMBRType),"htt

p://SomeWellKnownURL/SomeURI" );

12

Page 13: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Режим SingleCall

Второй режим серверной активизации — SingleCall — обеспечивает поддержку модели

программирования без сохранения состояния.

Для типа, сконфигурированного как SingleCall, инфраструктура .NET Remoting будет

активизировать новый экземпляр при каждом вызове клиентом метода этого типа.

После того как вызов метода обработан, инфраструктура .NET Remoting делает экземпляр

типа доступным сборщику мусора.

Следующий фрагмент кода демонстрирует программный способ конфигурирования

дистанцируемого объектного типа в режиме SingleCall в приложении, которое реализует этот

дистанцируемый объектный тип:

RemotingConfiguration.RegisterWellKnownServiceType(typeof( SomeMBRType ),

"SomeURI", WellKnownObjectMode.SingleCall );

13

Page 14: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Клиентская активизация

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

удаленного объекта. Для этой цели .NET Rernoting предоставляет клиентскую активизацию. В

отличие от общеизвестных типов с серверной активизацией, инфраструктура .NET Remoting

назначает URI каждому экземпляру типа с клиентской активизацией.

Экземпляры типов с клиентской активизацией могут оставаться активными в промежутках

между вызовами методов и использовать ту же схему управления временем жизни, что и

типы Singleton. Однако, вместо того чтобы обрабатывать все клиентские запросы с помощью

единственного экземпляра типа, здесь ссылка каждого клиента отображается на отдельный

экземпляр дистанцируемого типа.

Ниже приведен пример программной конфигурации дистанцируемого объектного типа как

активизируемого клиентом в приложении, которое реализует этот дистанцируемый объектный

тип:RemotingConfiguration.RegisterActivatedServiceType(typeof( SomeMBRType ));

Соответствующий конфигурационный код в клиентском приложении будет таким:RemotingConfiguration.RegisterActivatedClientType(typeof( SomeMBRType

),"http://SomeURL");

14

Page 15: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ15

.NET Remoting. Алгоритм создания сервера

Подключение System.Runtime.Remoting в Reference.

Класс сервера должен быть наследником MarshalByRefObject

Создаем интерфейс , который будет реализовывать серверный объект и помещаем его в

отдельной dll.

В приложении-хосте подключаем следующие namespace

System.Runtime.Remoting;

System.Runtime.Remoting.Channels;

System.Runtime.Remoting.Channels.Http;

Пишем метод, который конфигурирует Remoting сервер:

HttpChannel myChannel = new HttpChannel(8080);//создаем серверный канал

ChannelServices.RegisterChannel(myChannel,false);

RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyServiceClass)

,"MyServiceName.rem",WellKnownObjectMode.Singleton);

Page 16: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ16

.NET Remoting. Server Host. Пример

1. using System;

2. using System.Collections.Generic;

3. using System.ComponentModel;

4. using System.Data;

5. using System.Drawing;

6. using System.Text;

7. using System.Windows.Forms;

8. using System.Runtime.Remoting;

9. using System.Runtime.Remoting.Channels;

10. using System.Runtime.Remoting.Channels.Tcp;

11. namespace Lab2RemotingApp

12. {

13. public partial class Form1 : Form

14. {

15. public Form1()

16. {

17. InitializeComponent();

18. }

19.

20. private void button1_Click(object sender, EventArgs e)

21. {

22. TcpChannel myChannel = new TcpChannel(25701);

23. ChannelServices.RegisterChannel(myChannel,false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(Lab2RemotingService.HelloWorld),

24. "HelloWorld.rem",

25. WellKnownObjectMode.SingleCall);

26.

27. }

28. }

29. }

Page 17: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ17

.NET Remoting. Клиент

Подключение System.Runtime.Remoting в Reference.

Подключаем сборку с интерфейсом в зависимые сборки;

В приложении-хосте подключаем следующие namespace

System.Runtime.Remoting;

System.Runtime.Remoting.Channels;

System.Runtime.Remoting.Channels.Http;

Пишем код, инициализирующий каналы:

HttpChannel myChannel = new HttpChannel(); // создаем клиентский канал

ChannelServices.RegisterChannel(myChannel,false);

Пишем код, осуществляющий вызов:

IMyServiceClass obj =

(IMyServiceClass)Activator.GetObject(typeof(IMyServiceClass),"http://loca

lhost:8080/MyServiceName.rem",WellKnownObjectMode.Singleton);

Page 18: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ18

.NET Remoting. Клиент. Пример

1. using System;

2. using System.Collections.Generic;

3. using System.ComponentModel;

4. using System.Data;

5. using System.Drawing;

6. using System.Text;

7. using System.Windows.Forms;

8.

9. namespace Lab2Client

10. {

11. public partial class Lab2Form : Form

12. {

13. public Lab2Form()

14. {

15. InitializeComponent();

16. }

17.

18. private void button1_Click(object sender, EventArgs e)

19. {

20. String szURL="tcp://localhost:25701/HelloWorld.rem";

21. Lab2RemotingService.IHelloWorld objLab2Service =

22. (Lab2RemotingService.IHelloWorld) Activator.GetObject(typeof(Lab2RemotingService.IHelloWorld),szURL);

23.

24. this.richTextBox1.Text = objLab2Service.doHelloWorld();

25. }

26. }

27. }

Page 19: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ19

.NET Remoting. Сервер

Использование файла конфигурации

App.Config

1. <system.runtime.remoting>

2. <application>

3. <channels>

4. <channel ref="tcp" port="25701">

5. <serverProviders>

6. <formater ref=“binary”/>

7. </serverProviders>

8. </channel>

9. </channels>

10. <service>

11. <wellknown mode="SingleCall"

12. type="Lab2RemotingService.HelloWorld,Lab2RemotingService"

13. objectUri="HelloWorld.rem"/>

14. </service>

15. </application>

16. <customErrors mode="off"/>

17. </system.runtime.remoting>

Пишем код для конфигурирования

RemotingConfiguration.Configure(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile,false);

Page 20: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Реализация CallBack

Для реализации Callback необходимо:

На клиенте реализовать объект – наследник MarchalByRefObject, который пердать на

сервер в качестве параметра.

Разрешить инфраструктуре .NET стерилизовать MBR объекты. Для этого нужно явно

указать форматеру уровень фильтрации (на клиенте и сервере):

BinaryServerFormatterSinkProvider provider = new

BinaryServerFormatterSinkProvider();

provider.TypeFilterLevel = TypeFilterLevel.Full;

Зарегистрировать на клиенте канал, для обратных вызовов:

IDictionary props = new Hashtable();

props["port"] = 0;

TcpChannel chan = new TcpChannel(props, null, provider);

20

Page 21: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ21

.NET Remoting. Правила использования

Передача параметров вызова по значению или по ссылке?

Размер передаваемых объектов?

Данные передаются в пакетном (а не в потоковом режиме), т.е. для отправки данных они вначале

полностью загружаются в память.

Все ли поля объектов надо передавать?

Для тех, которые не надо нужно использовать атрибут NonSerialized

Как часто необходимо передавать объекты?

Нужно минимизировать число удаленных вызовов.

Сколько клиентов Singleton объект может поддерживать?

Необходимо определить максимальное число клиентов, и использовать несколько серверов.

Как долго серверный объект будет хранить состояние?

Могут ли объекты с состояниями использоваться для повышения производительности?

Будут ли использоваться фаирволы между сервером и клиентом.

Влияет на выбор канала HTTP/TCP.

Будут ли осуществляться обратные вызовы со стороны клиента?

Как будет производится замена версии сервера в случае если режим его работы 24 на 7?

Page 22: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ22

.NET Remoting. Асинхронный вызов

1. using System;

2. using System.Reflection;

3. using System.Runtime.Remoting;

4. using System.Runtime.Remoting.Channels;

5. using System.Runtime.Remoting.Channels.Http;

6. using System.Runtime.Remoting.Channels.Tcp;

7. using System.Runtime.Remoting.Messaging;

8. using RemotingInterface;

9. namespace RemotingClient

10. {

11. class Client

12. {

13. delegate ComplexObject RemoteAsyncDelegate(String stringParam, int intParam, double doubleParam, string[] arrayParam);

14. RemoteAsyncDelegate del = null;

15. [OneWay]

16. public void OurCallBack(IAsyncResult res)

17. {

18. Console.WriteLine("AsyncResult " + ((ComplexObject)del.EndInvoke(res)).stringParam);

19. }

20. public void Start()

21. {

22. String url = "tcp://localhost:25701/MyServer.rem";

23. IServer srv = (IServer)Activator.GetObject(typeof(IServer), url);

24. AsyncCallback RemoteCallback = new AsyncCallback(this.OurCallBack);

25. del = new RemoteAsyncDelegate(srv.doSomething);

26. IAsyncResult RemAr = del.BeginInvoke("Hello world",1,1,new String[0],RemoteCallback,null);

27. RemAr.AsyncWaitHandle.WaitOne();

28. Console.WriteLine("Done");

29. }

30. }

31. }

Page 23: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Удаленный сборщик мусора!

23

Page 24: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Лицензия объекта

Для управления временем жизни удаленных объектов .NET Remoting использует

вариант распределенной сборки мусора на основе лицензий (lease). Чтобы понять

причину выбора подобной схемы управления временем жизни, рассмотрим

случай взаимодействия множества клиентов с удаленным объектом,

активизируемым сервером в режиме Singleton. Схемы управления временем

жизни, не использующие лицензии, могут применять для определения

необходимости ликвидации такого объекта сочетание опроса клиентов и подсчета

ссылок. Число ссылок соответствует числу подключенных клиентов, тогда как

опрос гарантирует, что клиенты все еще функционируют. В подобной схеме

сетевой трафик, связанный с опросом клиентов, иногда негативно сказывается на

общей работе распределенного приложения. В противоположность этому система

управления временем жизни на основе лицензий использует лицензии, спонсоров

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

общую производительность

Лицензия — это объект, инкапсулирующий значения TimeSpan, используемые

инфраструктурой .NET Remoting для управления временем жизни удаленного

объекта. Для реализации этой функциональности инфраструктура .NET Remoting

предоставляет интерфейс ILease. Когда CLR активизирует экземпляр

общеизвестного объекта Singleton или удаленного объекта с клиентской

активизацией, она запрашивает у объекта срок лицензии, вызывая его метод

InitializeLHetimeSetvices, наследуемый от System.МаrshalByRet'Object.

24

Page 25: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ25

.NET Remoting. Лицензия объекта

Необходимо переопределить метод InitializeLifetimeService

Необходимо написать код для инициализации параметров жизненного цикла объекта:

1. using System.Runtime.Remoting.Lifetime;

2. ...

3. public override Object InitializeLifetimeService()

4. {

5. ILease lease=(ILease)base.InitializeLifetimeService();

6. if(lease.CurrentState== LeaseState.Initial)

7. {

8. lease.InitialLeaseTime = TimeSpan.FromSeconds(5); // время, после которого можно помещать в мусор, 0 - бесконечность;

9. lease.RenewOnCallTime = TimeSpan.FromSeconds(1);// время, на которое продляется жизнь при вызове;

10. lease.SponsorshipTimeout = TimeSpan.FromSeconds(5);//время ожидания ответа от спонсора на клиенте (для этого нужно на клиенте зарегистрировать серверный канал)

11. }

12. return lease;

13. }

14. ..

Page 26: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Диспечер лицензий

В каждом домене приложения имеется диспетчер лицензий, управляющий лицензиями экземпляров

дистанцируемых объектов этого домена. При активизации удаленного объекта инфраструктура .NET Remoting

передает его лицензию диспетчеру лицензий.

Диспетчер периодически просматривает список лицензий, сравнивая время окончания действия лицензий с

текущим временем. По умолча-нию диспетчер лицензий выполняет проверку окончания лицензий каждые 10

секунд, но периодичность опроса можно изменить (LifetimeServices.LeaseManagerPollTime

=System.TimeSpan.FromMinutes(5);).

Каждая лицензия, срок действия которой истек, уведомляется об этом диспетчером лицензий, после чего

лицензия пытается продлить себя, опрашивая своих спонсоров. Если у лицензии нет спонсоров или никто из

них не продлил ее, то лицензия отменяет себя, выполняя следующие действия:

устанавливает свое состояние в System.Runtime.Remoting.Lifetime.LeaseState.Expired;

уведомляет диспетчер лицензий о том, что ее следует удалить из таблицы лицензий;

отключает удаленный объект от инфраструктуры .NET Remoting;

отключает объект-лицензию от инфраструктуры .NET Remoting.

26

Page 27: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Спонсоры

Спонсоры — это объекты, которые могут продлить лицензии удаленных объектов. Для создания типа,

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

ClientSponsor в пространстве имен System.Runtime.Remoting.Lifetime, который вы вправе использовать в

своих программах. Этот класс является производным от System.MarshalByRefObject и реализует интерфейс

ISponsor.

// Использование класса ClientSponsor : предполагается,

// что someMBR ссылается на экземпляр типа,

// производного от MarshalByRefObject.

// спонсор будет продлять время ссылки на 5 минут

ClientSponsor cp = new ClientSponsor(TimeSpan.FromMinutes(5));

MyClass obj = new MyClass();

ILease lease = (ILease)RemotingServices.GetLifetimeService(obj);

lease.Register(cp);

27

Page 28: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Java.RMI

Локальный Java-объект Удаленный Java-объект

Определение

объекта

Локальный объект определяется при

помощи класса Java.

Экспортируемое поведение удаленного объекта определяется при

помощи интерфейса, который должен быть расширен из интерфейса

Remote.

Реализация объекта Локальный объект реализуется

своим классом Java.

Поведение удаленного объекта определяется классом Java, который

реализует удаленный интерфейс.

Создание объекта Новый экземпляр локального

объекта создается оператором new.

Новый экземпляр удаленного объекта создается на компьютере хоста

оператором new. Клиент не может непосредственно создать новый

удаленный объект (если не использует технологию Java 2 Remote Object

Activation).

Доступ к объекту Доступ к локальному объекту

осуществляется непосредственно

через переменную-ссылку на объект.

Доступ к удаленному объекту осуществляется через переменную-ссылку

на объект, указывающую на реализацию замещающей заглушки

удаленного интерфейса.

Активные ссылки В одной JVM, объект считается

"живым", если существует хотя бы

одна ссылка на него.

В распределенной среде удаленная JVM может разрушиться, и сетевое

соединение может быть потеряно. Считается, что удаленный объект

имеет активную удаленную ссылку на него, если к нему производился

доступ в течение определенного периода времени (срока аренды). Если

все удаленные ссылки были удалены явно, или если у всех удаленных

ссылок закончился срок аренды, тогда удаленный объект становится

доступен для удаленной сборки мусора.

Сборка мусора При удалении всех локальных

ссылок на объект, он становится

кандидатом на удаление сборщиком

мусора.

Удаленный сборщик мусора работает совместно с локальным. Если нет

удаленных ссылок и удалены все локальные ссылки на объект, он

становится кандидатом для сборщика мусора в обычном значении этого

понятия.

28

Page 29: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ29

RMI.Java. Порядок создания распределенного приложения

Сервер

Написание Удалённого интерфейса наследника java.rmi.Remote

Написание класса- сервера Реализующего удалённый интерфейс

Написание кода отвечающего за регистрацию сервера в службе каталогов

Создание Скелетных компонент и Заместителя с помощью утилиты rmic.exe из Sun JDK

Изменение переменной среды CLASSPATH (внести путь к классам сервера)

Запуск Сервера

• Запуск брокера запросов rmiregistry.exe из состава Sun JDK

• Запуск сервера

Клиент

Написание клиента использующего удалённый интерфейс.

Написание кода осуществляющего подключение к удалённому серверу

Запуск Клиента

Page 30: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Как клиент находит удаленную службу RMI?

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

RMI может использовать много различных служб каталогов, включая Java Naming and

Directory Interface (JNDI). RMI и сама включает в себя простую службу, называемую реестром

RMI, rmiregistry. Реестр RMI работает на каждой машине, содержащей объекты удаленных

служб и принимающей запросы на обслуживание, по умолчанию используя порт 1099.

На хосте программа сервера создает удаленную службу, предварительно создавая

локальный объект, реализующий эту службу. Затем она экспортирует этот объект в RMI. Как

только объект экспортирован, RMI создает службу прослушивания, ожидающую соединения с

клиентом и запроса службы. После экспорта, сервер регистрирует объект в реестре RMI,

используя общедоступное имя.

На стороне клиента к реестру RMI доступ обеспечивается через статический класс Naming.

Он предоставляет метод lookup(), который клиент использует для запросов к реестру. Метод

lookup() принимает URL, указывающий на имя хоста и имя требуемой службы. Метод

возвращает удаленную ссылку на обслуживающий объект. URL принимает следующий вид:

rmi://<host_name> [:<name_service_port>] /<service_name>

где host_name - это имя, распознаваемое в локальной сети (LAN), или DNS-имя в сети

Internet. Необходимо только указать name_service_port, если служба имен исполняется на

порте, отличном от принимаемого по умолчанию 1099.

30

Page 31: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

RMI Compiler

rmic <options> <class names>

where <options> includes:

-keep Do not delete intermediate generated source files

-keepgenerated (same as "-keep")

-g Generate debugging info

-depend Recompile out-of-date files recursively

-nowarn Generate no warnings

-verbose Output messages about what the compiler is doing

-classpath <path> Specify where to find input source and class files

-d <directory> Specify where to place generated class files

-J<runtime flag> Pass argument to the java interpreter

31

Page 32: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ32

Java.Server.Пример интерфейса

1. import java.rmi.Remote;

2. import java.rmi.RemoteException;

3.

4. public interface ILab3Interface extends Remote

5. {

6. public int[] doHelloWorld(int[] src) throws RemoteException;

7. }

Page 33: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ33

Java.Server.Пример

1. import java.rmi.Naming;

2. import java.rmi.RemoteException;

3. import java.rmi.RMISecurityManager;

4. import java.rmi.server.UnicastRemoteObject;

5.

6. public class Lab3Server extends UnicastRemoteObject implements ILab3Interface

7. {

8. public Lab3Server() throws RemoteException {super();}

9. public static void main(String[] args)

10. {

11. try {

12. Naming.rebind("Lab3Server", new Lab3Server());

13. System.out.println("Server bound in registry");

14. } catch (Exception e) {e.printStackTrace();}

15. }

16. public int[] doHelloWorld(int[] src) throws RemoteException

17. {

18. int[] result = new int[src.length];

19. for(int i=0;i<src.length;i++) result[i]=src[src.length-i-1];

20. return result;

21. }

22. }

Page 34: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ34

Java.Client.Пример

1. import java.rmi.Naming;

2. import java.rmi.RemoteException;

3.

4. public class Lab3Client {

5. public static void main(String[] args) {

6.

7. try{

8. ILab3Interface server = (ILab3Interface) Naming.lookup("rmi://localhost/Lab3Server");

9.

10. int src[]=new int[] {1,2,3,4,5};

11. int ret[] = server.doHelloWorld(src);

12. System.out.println("Result:");

13. for(int i=0;i<ret.length;i++) System.out.println("["+i+"]="+ret[i]);

14.

15. }catch(Exception e)

16. {

17. e.printStackTrace();

18. }

19. }

20. }

Page 35: МАИ, Сети ЭВМ, Лекция №4

МАИ, каф 806, Сети ЭВМ

Клиентские обратные вызовы RMI

RMI работает одинаково хорошо между всеми компьютерами. Однако, расширение клиентом

java.rmi.server.UnicastRemoteObject может быть не практичным. В этих случаях удаленный

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

java.rmi.server.RemoteStub UnicastRemoteObject.exportObject (Remote

<remote_object>).

Далее передаем клиентский объект в качестве параметра серверу.

Сервер может вызывать клиентский объект.

35