Главная » Silverlight » Локальное соединение

0

Как видите, платформа Silverlight предоставляет мощные, но довольно сложные средства коммуникации с помощью сокетов. Между тем, в Silverlight есть другой, более простой, механизм коммуникации — модель локальных соединений.

Поддержка сокетов позволяет приложению Silverlight сообщаться практически с лю­бой сетевой программой, выполняющейся на любом компьютере (конечно, если бранд­мауэр не блокирует коммуникацию). значительно скромнее. Оно предоставляет простой способ сообщения между двумя приложениями Silverlight, вы­полняющимися на одном компьютере. Оно особенно полезно для приложений, выпол­няющихся вне браузера, потому что обычно пользователи запускают и оставляют их загруженными длительное время.

Рассмотрим создание приложения, показанного на рис. 20.10.

Модель локального соединения основана на использовании двух классов, рас­положенных в пространстве имен System. Windows .Messaging, — LocalMessageSender и LocalMessageReceiver. Вместе эти классы обеспечивают одностороннюю коммуни­кацию. Класс LocalMessageSender передает сообщение, a LocalMessageReceiver при­нимает его. Чтобы оба приложения могли передавать и принимать сообщения, нужно всего лишь добавить в них оба класса.

Коммуникацию можно организовать не только между двумя приложениями. Сообщение, передаваемое одним приложением, может приниматься несколькими прило­жениями, выполняющимися в то же время. Сообщение может также остаться неприня­тым ни одним приложением. В отличие от сокетов, в локальных соединениях реализует­ся принцип "выстрелил и забыл". Передающее приложение не знает, получил ли кто- либо его сообщение (конечно, если не добавлена специальная система подтверждения).

Рис. 20.10. Обмен сообщениями между локальными приложениями

Передача сообщения

Чтобы передать сообщение, создайте экземпляр класса LocalMessageSender. Удобнее создать один экземпляр и сохранить его как переменную страницы.

private LocalMessageSender messageSender = new LocalMessageSender("EavesdropperReceiver");

Объекту LocalMessageSender нужно предоставить имя получателя. Оно будет приме­нено для прослушивания. Фактическое имя ничего не означает, однако в передающем и получающем приложениях должно использоваться одно и то же имя.

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

private LocalMessageSender messageSender = new LocalMessageSender("EavesdropperReceiver", "anotherWebDomain.com");

Можно также создать глобального отправителя сообщений.

private LocalMessageSender messageSender = new LocalMessageSender("EavesdropperReceiver", LocalMessageSender.Global);

Тогда сообщение может быть получено приложением, загруженным из любого доме­на. В этом случае рекомендуется сделать имя получателя уникальным. Не используйте распространенные имена, такие как receiver или MesageReceiver, потому что в других приложениях могут случайно использоваться эти же имена.

После создания объекта LocalMessageSender, нужно вызвать его метод SendAsync О и передать ему сообщение как строку. Иногда полезно обработать событие Local­MessageSender .Completed, генерируемое в момент завершения передачи (факт получе­ния или неполучения этим событием не учитывается).

Ниже приведен код, передающий сообщение при каждом нажатии клавиши пользо­вателем (см. рис. 20.10).

private void txt_KeyUp(object sender, KeyEventArgs e)

{

messageSender.SendAsync(txt.Text);

)

Получение сообщения

Чтобы получить сообщение, нужно создать объект LocalMessageReceiver. Ему нужно предоставить имя получателя, примененное при создании объекта LocalMessageSender.

private LocalMessageReceiver receiver = new LocalMessageReceiver("EavesdropperReceiver");

Приведенный выше объект LocalMessageReceiver получает сообщения от приложе­ний, загруженных с того же домена, что и получающее приложение. Однако объекту LocalMessageReceiver можно передать массив доменов, из которых ему разрешено по­лучать сообщения. В приведенном ниже примере получатель Eavesdropper может при­нимать сообщения из домена anotherWebDomain. com.

LocalMessageReceiver messageReceiver = new LocalMessageReceiver("Eavesdropper", ReceiverNameScope.Domain, new string[]{"anotherWebDomain.com"});

Разрешить принимать сообщения из любого домена можно следующим образом.

LocalMessageReceiver messageReceiver = new LocalMessageReceiver("Eavesdropper", ReceiverNameScope.Global, LocalMessageReceiver.AnyDomain);

После создания объекта LocalMessageReceiver, нужно подключить обработчик к его . событию MessageReceived и включить прослушивание, вызвав метод Listen ().

private void Page_Loaded(object sender, RoutedEventArgs e)

{

receiver.MessageReceived += receiver_MessageReceived;

receiver.Listen();

}

Метод Listen () асинхронный, поэтому прослушивание выполняется в отдельном потоке. Приложение при этом продолжает работать как обычно. Когда сообщение полу­чено, прослушивающий поток генерирует событие MessageReceived в потоке пользова­тельского интерфейса и возобновляет прослушивание. Приведенный ниже код выводит полученное сообщение в текстовом блоке (см. рис. 20.10).

private void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)

{

lblDisplay.Text = "Пользователь главного приложения ввел: + е.Message + "\"м;

}

Резюме

В этой главе рассмотрен широкий диапазон сетевых средств Silverlight. Вы узнали о способах непосредственной загрузки файлов HTML, вызова веб-служб XML, создания низкоуровневых сокетных соединений. Рассмотрены технологии синтаксического раз­бора данных разных типов, включая сериализацию, использование регулярных вы­ражений, кодирование выражений LINQ и т.д. Рассмотренные технологии полезны не только при создании сетевых приложений Silverlight, но и во многих других ситуациях, например для управления информацией, размещаемой в изолированном хранилище ло­кального компьютера. В конце главы рассмотрено использование локальных соедине­ний для коммуникации между приложениями, выполняющимися на одном компьютере.

1. В рабочей среде Visual Studio выберите команду File^New1^ Project (Файл^ Создать1^Проект). В окне типов проекта выделите группу Visual С# и шаблон Silverlight Application (Приложение Silverlight). Рекомендуется установить флажок Create directory for solution (Создать папку для решения), чтобы можно было сгруп­пировать два создаваемых проекта: для сборки Silverlight и для сайта ASP.NET.

Примечание. Сайт без ASP.NET можно развернуть на любом веб-сервере. В этом сценарии на сервер возложена единственная задача — передавать клиентам файлы HTML и сопровождающие их статические файлы изображений, таблиц CSS и т.д. Если же планируется создать сайт с ASP.NET, требования к серверу существенно возрастают. Содержимое Silverlight может выполняться на любом клиентском устройстве, однако содержимое ASP.NET может выполняться только на сервере, на котором установлен драйвер ASP.NET.

1 В папке Chapter02\Resources несколько примеров объединены в одном приложении. Чтобы открыть пример, запустите приложение и щелкните на соответствующей кнопке. При создании рисунков для книги меню примеров было удалено. Аналогичным образом примеры организованы и в других главах. — Примеч. ред.

1 Свойство Margin (Внешняя пустая полоска) задает расстояние от рамки до соседнего элемента, а свойство Padding (Внутренняя пустая полоска) — от рамки до содержимого. — Примеч. ред.

Во многих ситуациях желательно, чтобы анимация начиналась не с исходного зна­чения From. Этому есть две причины.

•       Иногда нужно запускать анимацию много раз подряд для создания эффек­та наращивания. Например, можно создать кнопку, немного расширяющуюся при каждом щелчке.

•     Создайте анимацию, которая переустанавливает элемент в исходное состояние. Для этого опустите свойство То. Например, в анимации сокращающейся кнопки задайте уменьшение ширины до последнего установленного размера, а после это­го измените ширину в коде.

•       Создайте обратимую анимацию. Для этого присвойте свойству AutoReverse значение True. Например, когда кнопка кончила расширяться, анимация будет продолжена в обратном направлении, возвращая ширину в исходное состояние. Общая продолжительность анимации удваивается.

•       Измените свойство FillBehavior. Обычно оно имеет значение HoldEnd, в результа­те чего после завершения анимации конечное значение продолжает применяться к целевому свойству. Если свойству FillBehavior присвоить значение Stop, то при завершении анимации свойству будет возвращено исходное значение.

•       При завершении анимации удалите анимационный объект, подключив обработ­чик к его событию Completed раскадровки или объекта анимации.

Пользовательские элементы управления применяются в Silverlight реже, чем на других мощных клиентских платфор­мах. Это объясняется тем, что Silverlight предоставляет много других способов настройки.

•       Содержимое элемента управления. Любой элемент управления, производный от класса ControlControl, поддерживает вложение содержимого. Это позволяет быстро создавать комбинированные элементы управления, объединяющие и сочетающие другие элементы. Например, можно преобразовать кнопку в кнопку с изображением или поле списка — в список изображений.

•       Стили и шаблоны элементов управления. Стили можно применять для гибкого повторного использования комбинаций свойств элементов управления. Благодаря этому нет необходимости создавать пользовательский элемент управления только для изменения внешнего вида стандартного элемента. Шаблоны предоставляют более мощные возможности, позволяя настраивать все параметры внешнего вида элемента управления.

•      Шаблоны элементов управления. Все элементы управления WPF и Silverlight безликие. Это означает, что в них жестко встроено поведение, но внешний вид определяется отдельно с помощью шаблонов. Заменяя шаблоны, используемые по умолчанию, чем-либо иным, легко изменять внешний вид базовых элементов управления, таких как кнопки, флажки, переключатели и даже окна.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии