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

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

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

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

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

using System;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace Wrox.ProfessionalCSharp {
 /// <summary>
 /// Краткое описание Class1.
 /// </summary>
 public class HelloClient {
  public static void Main(string[] args) {
   ChannelServices.RegisterChannel(new TcpClientChannel());
   Hello obj = (Hello)Activator.GetObject(typeof(Hello), "tcp://localhost:8086/Hi");
   if (obj == null) {
    Console.WriteLine("could not locate server"); return;
   }
   for (int i = 0; i < 5; i++) {
    Console.WriteLine(obj.Greeting("Christian"));
   }
  }
 }
}

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


Первый конструктор вызывается во время регистрации удаленного объекта. Как утверждалось ранее, метод RemotingConfiguration.RegisterWellKnownServiceType() уже создает один экземпляр. Затем для каждого вызова метода создается новый экземпляр, так как был выбран режим активации WellKnownObjectMode.SingleCall. В зависимости от синхронизации и необходимых ресурсов, будут наблюдаться также вызовы деструктора. Если запустить клиент несколько раз, то вызовы деструктора будут присутствовать наверняка.

Оглавление книги


Генерация: 0.236. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз