Чтение онлайн

ЖАНРЫ

C# для профессионалов. Том II

Ватсон Карли

Шрифт:

Удаленные объекты, клиенты и серверы

Прежде чем перейти к рассмотрению деталей архитектуры .NET Remoting, давайте рассмотрим кратко удаленный объект и очень маленькое простое клиентское серверное приложение, которое использует этот удаленный объект. Затем мы обсудим более подробно все необходимые шаги и параметры.

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

Hello
.
HelloServer
является основным классом приложения на сервере, a
HelloClient
предназначен для клиента:

Удаленные

объекты

Удаленные объекты требуются для распределенного вычисления. Объект, вызываемый удаленно с другой системы, выводится из объектов

System.MarshalByRefObject.MarshalByRefObject
и соответствует домену приложения, в котором они создаются. Это означает, что такие объекты никогда не переходят между доменами приложений; вместо этого используется объект прокси для доступа к удаленному объекту изнутри другого домена приложения. Другой домен приложения может существовать внутри того же процесса, другого процесса, или на другой системе.

Удаленный объект имеет распределенную идентичность. В связи с этим ссылка на объект может передаваться другим клиентам, и они также будут получать доступ к тому же объекту. Прокси знает об идентичности удаленного объекта.

Класс

MarshalByRefObject
имеет в дополнение к унаследованным методам из класса
Object
методы для инициализации и получения служб времени жизни. Службы времени жизни определяют, как долго живут удаленные объекты. Службы времени жизни и арендуемые свойства будут рассмотрены позже в этой главе.

Чтобы увидеть .NET Remoting в действии, создается простая библиотека классов для удаленного объекта. Класс

Hello
выводится из
System.MarshalByRefObject
. В конструкторе и деструкторе на консоли записывается сообщение, чтобы было известно о времени жизни объекта. Кроме того, имеется только один метод
Greeting
, который будет вызываться от клиента.

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

RemoteHello.dll
, а классу —
Hello
. Типом проекта Visual Studio.NET, используемым для этого класса, является Visual C# Class Library:

namespace Wrox.ProfessionalCSharp {

 using System;

 /// <summary>

 /// Краткое описание Class1

 /// </summary>

 public class Hello: System.MarshalByRefObject {

public Hello {

Console.WriteLine("Constructor called");

}

~Hello {

Console.WriteLine("Destructor called");

}

public string Greeting(string name) {

Console.WriteLine("Greeting called");

return "Hello, " + name;

}

 }

}

Простой сервер

Для сервера используется консольное

приложение C#. Для применения класса
TcpServerChannel
необходимо сослаться на сборку
System.Runtime.Remoting.dll
. Также требуется, чтобы мы ссылались на созданную ранее сборку
RemoteHello.dll
.

В методе

Main
создается объект
System.Runtime.Remoting.Channel.Тcр.TcpServerChannel
с портом номер 8086. Этот канал регистрируется в классе
System.Runtime.Remoting.Channels.ChannelServices
, чтобы сделать его доступным для удаленных объектов. Тип удаленного объекта регистрируется с помощью
System.Runtime.Remoting.RemotingConfiguration.RegisterWellKnownServiceType
. Здесь определяется тип класса в удаленном объекте, используемый клиентом URI, и режим. Режим
WellKnownObject.SingleCall
означает, что для каждого вызова метода создается новый экземпляр, мы не храним состояние в удаленном объекте.

После регистрации удаленного объекта продолжим выполнение сервера, пока не будет нажата клавиша:

using System;

using System.Runtime.Remoting;

using System.Runtime.Remoting.Channels;

using System.Runtime.Remoting.Channels.Tcp;

namespace Wrox.ProfessionalCSharp {

 /// <summary>

 /// Краткое описание Class1

 /// </summary>

 public class HelloServer {

public static void Main(string[] args) {

TcpServerChannel channel = new TcpServerChannel(8086);

ChannelServices.RegisterChannel(channel);

RemotingConfiguration.RegisterWellKnownServiceType(

typeof(Hello), "Hi", WellKnownObjectMode.SingleCall);

System.Console.WriteLine("hit to exit");

System.Console.ReadLine;

}

 }

}

Простой клиент

Клиент также является консольным приложением C#. И здесь делается ссылка на сборку

System.Runtime.Remoting.dll
, чтобы можно было использовать класс
TcpClientChannel
. Кроме того, имеется ссылка на сборку
RemoteHello.dll
. Хотя объект будет создаваться на удаленном сервере, нам понадобится сборка на стороне клиента, чтобы прокси прочитал метаданные во время выполнения.

В клиентской программе создается объект

TcpClientChannel
, который регистрируется в
ChannelServices
. Для
TcpChannel
используется конструктор по умолчанию, поэтому выбирается свободный порт. Затем используется класс
Activator
для возврата прокси удаленному объекту. Прокси является типом
System.Runtime.Remoting.Proxies._TransparentProxy
. Этот объект выглядит как реальный. Это делается с помощью механизма отражения, в котором считываются метаданные реального объекта. Прозрачный прокси использует реальный для пересылки сообщений в канал:

Поделиться с друзьями: