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

Клиент

Клиент

Клиент читает конфигурационный файл клиента с помощью класса RemotingConfiguration. Так было со всеми клиентами, которые создавались до сих пор. Клиент создает локально экземпляр удаленного класса приемника EventSink. Метод, который должен вызываться из удаленного объекта на сервере, передается в удаленный объект:

using System;
using System.Runtime.Remoting;
namespace Wrox.ProfessionalCSharp {
 class Client {
  static void Main(string[] args) {
   RemotingConfiguration.Configure("Client.exe.config");

Различие начинается здесь. Мы должны создать локально экземпляр удаленного класса приемника EventSink. Так как этот класс не будет конфигурироваться элементом <client>, то его экземпляр создается локально. Затем мы получаем экземпляр класса удаленного объекта RemoteObject. Этот класс конфигурируется в элементе <client>, поэтому его экземпляр создается на удаленном сервере:

   EventSink sink = new EventSink();
   RemoteObject obj = new RemoteObject();

Теперь можно зарегистрировать метод обработчика объекта EventSink на удаленном объекте. StatusEvent является именем делегата, который был определен на сервере. Метод StatusHandler() имеет те же самые аргументы, которые определены в StatusEvent.

Вызывая метод LongWorking(), сервер будет делать обратный вызов в методе StatusHandler() в начале и в конце метода:

   // зарегистрировать клиентский приемник на сервере — подписаться
   // на событие
   obj.Status += new StatusEvent(sink.StatusHandler);
   obj.LongWorking(5000);

Теперь мы более не заинтересованы в получении событий с сервера и отменяем подписку на событие. Следующий раз при вызове LongWorking() никакие события не будут получены.

   // отменить подписку на событие
   obj.Status -= new StatusEvent(sink.StatusHandler);
   obj.LongWorking(5000);
   Console.WriteLine("Hit to exit");
   Console.ReadLine();
  }
 }
}

Конфигурационный файл клиента

Конфигурационный файл для клиента — client.exe.config является почти таким же конфигурационным файлом, как и для активированных клиентом объектов. Различие можно найти в определении номера порта для канала. Поскольку сервер должен соединяться с клиентом через известный порт, то необходимо определить номер порта для канала как атрибут элемента <channel>. Не требуется определять раздел <service> для класса EventSink, так как экземпляр этого класса будет создаваться клиентом локально с помощью оператора new. Сервер не получает доступ к этому объекту по его имени, вместо этого он получит маршализированную ссылку на экземпляр:

<configuration>
 <system.runtime.remoting>
  <application name="Client">
   <client url="http://localhost:6791/CallbackSample">
    <activated type="Wrox.ProfessionalCSharp.RemoteObject, RemoteObject" />
   </client>
   <channels>
    <channel type="System.Runtime.Remoting.Channels.Http.HttpChannel, System.Runtime.Remoting" port="777" />
   <channels>
  </application>
 </system.runtime.remoting>
</configuration>

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


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