Книга: 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>
- Совместимость клиентов и серверов различных версий
- Клиенты 3-го диалекта
- Аватар идеального клиента
- Определение версии клиента
- Снятие ответственности с клиента
- Приложение 21 Образец должностной инструкции начальника отдела по работе с сетевыми клиентами
- 4. Стадии бизнес-процесса взаимодействия с клиентами
- Почтовый клиент
- Клиентский компьютер
- Входящий поток потенциальных клиентов (LeadGen)
- 13.3. Настройка почтовых клиентов
- Скрипт «Опрос об удовлетворенности клиента после сделки»