Книга: ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Использование ТСР-каналов

Использование ТСР-каналов

В настоящий момент ваш удаленный объект доступен через сетевой протокол HTTP. Как уже упоминалось выше, этот протокол вполне совместим с брандмауэром, но генерируемые при этом пакеты SOAP немного "раздуты" (по причине представления данных в формате XML). Чтобы уменьшить сетевой трафик, можно изменить компоновочные блоки клиента и сервера так, чтобы в них использовался TCP-канал и, следовательно, тип BinaryFormatter. Вот подходящая модификация компоновочного блока сервера.

Замечание. Для файлов с определениями объектов, доступных по TCP-каналам о заданным URI, чаще всего (но не обязательно) используется расширение *.rem (от remote – удаленный).

// Корректировки для сервера.
using System.Runtime.Remoting.Channels.Tcp;

static void Main(string[] args) {
 …
 // Создание нового TcpChannel
 TcpChannel с = new TcpChannel(32469);
 ChannelServises.RegisterChannel(c);
 // Регистрация WKO-объекта в режиме синглета.
 RemotingConfiguration.RegisterWellKnownServiceType(typeof(SimpleRemotingAsm.RemoteMessageObject), "RemoteMsgObj.rem", WellKnownObjectMode.SingleCall);
 Console.ReadLine();
}

Здесь в слое удаленного взаимодействия .NET регистрируется тип System. Runtime.Remoting.Channels.Tcp.TcpChannel. Кроме того, изменен URI-объект (теперь для него задано более общее имя RemoteMsgObj.rem вместо *.soap, что явно указывало на использование SOAP). Модификация приложения клиента так же проста.

// Корректировки для клиента.
using System.Runtime.Remoting.Channels.Тcр;

static void Main(string[] args) {
 …
 // Создание нового TcpChannel
 TcpChannel с = new TcpChannel();
 ChannelServices.RegisterChannel(c);
 // Получение агента для удаленного объекта.
object remoteObj = Activator.GetObject(typeof(SimpleRemotingAsm.RemoteMessageObject), "tcp://localhost:32469/RemoteMsgObj.rem");
 // Использование объекта.
 RemoteMessageObject simple = (RemoteMessageObject)remoteObj;
 simple.DisplayMessage("Привет от клиента!");
 Console.WriteLine("Сервер говорит: {0}", simple.ReturnMessage());
 Console.ReadLine();
}

Единственным заслуживающим внимания моментом здесь является то, что URL активизации клиента теперь должен содержать признак канала tcp://, а не http://. Во всем остальном программная логика здесь оказывается идентичной программной логике HttpChannel,

Исходный код. Проекты TCPSimpleRemoteObjectServer и TCPSimpleRemoteObjectClient размещены в подкаталоге, соответствующем главе 18 (оба эти проекта используют созданный выше компоновочный блок SimpleRemotingAsm.dll).

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


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