Средства Windows Phone для работы с сетью
Создание клиентского приложения
Для того чтобы создать приложение Windows Phone, которое будет работать с созданной службой, нужно создать новый проект. Клиентское приложение должно подключаться к службе NewsOfTheDayService. Ссылка на службу добавляется в проект так же, как и ссылка на ресурс, только в контекстном меню в окне обозревателя решений нужно выбрать пункт Добавить ссылку на службу…. Откроется диалоговое окно Добавить ссылку на службу, в котором нужно указать URL запущенной службы. Visual Studio найдёт описание службы и все предоставляемые ею методы. Также можно изменить пространство имён по умолчанию, которое будет использоваться в создаваемом приложении, на NewsOfTheDayService.
После добавления ссылки на службу её можно использовать в решении. Теперь необходимо создать прокси-объект, который будет использоваться для вызова методов службы. Лучше сделать это в конструкторе главной страницы приложения:
NewsOfTheDayService.NewsOfTheDayServiceClient newsclient; // Конструктор public MainPage() { InitializeComponent(); newsclient = new NewsOfTheDayService.NewsOfTheDayServiceClient(); newsclient.GetDataCompleted += new EventHandler<NewsOfTheDayService.GetDataCompletedEventArgs> (newsclient_GetDataCompleted); }
Этот код создаёт прокси-объект для службы и связывает метод-обработчик с событием GetDataCompleted, которое происходит при получении ответа от службы. Вызов метода службы выполняется асинхронно. Метод-обработчик должен выводить на экран полученную новость:
void newsclient_GetDataCompleted(object sender, NewsOfTheDayService.GetDataCompletedEventArgs e) { if (!e.Cancelled) { newsTextBlock.Text = e.Result; } }
Этот метод проверяет, успешно ли завершился вызов метода службы, и если да, то выводит полученный результат экран.
После этого необходимо создать обработчик события нажатия на кнопку, в котором будет вызываться метод WCF для обращения к серверу:
private void getNewsButton_Click(object sender, RoutedEventArgs e) { int category = 0; if (int.TryParse(newsTextBox.Text, out category)) { newsclient.GetDataAsync(category); } }
Этот метод получает номер категории новости и передаёт его в качестве параметра при вызове метода GetDataAsync. Если текст в поле newsTextBox не может быть преобразован в целое число, метод TryParse вернёт значение false.
Если служба будет недоступна, при вызове метода GetDataAsync будет сгенерировано исключение. Это может произойти, если во время выполнения программы в телефоне сигнал сети не будет доступен. В приложениях для Windows Phone необходимо обрабатывать исключения в блоке try—catch и выдавать пользователю сообщение о недоступности сети.
Приложение при необходимости может взаимодействовать сразу с несколькими удалёнными службами. В этом случае для каждой службы добавляются ссылки в проект приложения, и работа с ними организуется точно таким же образом, что и в рассмотренном примере.
Краткие итоги
- Компьютерные сети предоставляют возможность отправки сообщений из одной системы в другую. Устройства могут объединяться в локальную сеть. В локальной сети может быть маршрутизатор, который отправляет пакеты из локальной сети удалённым узлах. Маршрутизаторы являются устройствами передачи данных, которые позволяют создавать межсетевые подключения.
- Полный адрес системы в сети содержит адрес этой станции в её локальной сети и адрес этой сети в Интернете.
- Данные могут передаваться между системами в виде отдельных дейтаграмм (UDP) или как часть подключения между двумя системами (TCP).
- К различным службам системы можно обращаться, указав номер порта, на котором работает требуемая служба. Некоторые номера портов зарезервированы и являются общепринятыми, например веб-сервер обычно работает на порту с номером 80.
- Приложения Windows Phone могут создавать и использовать объекты, которые представляют подключение к сетевой службе. Эти объекты работают в асинхронном режиме, при котором сетевые операции выполняются в отдельном потоке. Результаты асинхронного запроса обрабатываются при наступлении события окончания выполнения запроса без необходимости ожидания завершения запроса в программе.
- Сокеты являются абстракцией сетевого подключения.
- Некоторые сетевые вызовы могут возвращать структурированные данные, которые содержат XML-описание содержимого.
- Библиотеки LINQ могут создавать динамические объекты для представления структурированных данных и их использования в программе.
- Технология Windows Communication Foundation (WCF) предоставляет возможность настроить сервер так, чтобы можно было вызывать их методы в клиентских приложениях.
- Клиентское приложение может прочитать описание службы, которое предоставляет сервер WCF, и использовать его для создания прокси-объекта, который содержит методы, предоставляемые службой. При вызове в клиентском коде метод прокси-объекта запускается сетевая операция, которая передаёт параметры метода на сервер. Затем вызывается метод сервера, и сетевая операция возвращает результат коду, который вызвал серверный метод.
Ключевые термины
IP-адрес — уникальный сетевой адрес узла в компьютерной сети, построенной по протоколу IP.
Windows Communication Foundation — технология компании Microsoft, основанная на .NET Framework, которая используется для обмена данными между приложениями, находящихся обычно на разных устройствах.
Асинхронное подключение — тип подключения, которое работает паралллельно с основной программой и обычно обрабатывается в отдельном потоке.
Брандмауэр — комплекс аппаратных или программных средств, осуществляющий контроль и фильтрацию проходящих через него сетевых пакетов в соответствии с заданными правилами.
Дейтаграмма — блок информации, посланный как пакет сетевого уровня через передающую среду без предварительного установления соединения и создания виртуального канала.
Конечная точка подключения — удалённый узел, к которому подключается программа на текущем узле.
Маршрутизация — процесс определения маршрута следования информации в сетях связи.
Октетами — наименьшая единица информации, которая может быть передана по сети, равняется 8 битам.
Порт — условный номер, который соответствует программе или службе, которая может принимать входящие сообщения из компьютерной сети. В рамках одного устройства каждая подключенная к сети программа или служба должна иметь уникальный номер порта.
Сетевой маршрутизатор — сетевое устройство, пересылающее пакеты данных между различными сегментами сети.
Сетевой протокол — набор соглашений, которые определяют, как происходит обмен данными между устройствами в сети.
Сетевые сигналы — носитель информации, которая передаётся через компьютеную сеть.
Система доменных имён — компьютерная распределённая система для получения информации о доменах, позволяет связать имя узла с его IP-адресом.
Широковещательный адрес — условный адрес, который используется для передачи широковещательных пакетов в компьютерных сетях. Широковещательный адрес не может быть присвоен какому-либо узлу сети.
Вопросы
- Какие типы подключений к сети доступны в Windows Phone?
- Какие образом данные передаются по сети?
- Для чего используется система доменных имён?
- Каким образом несколько взаимодействующих с сетью служб могут работать на одном сервере только с теми сообщениями, которые для них предназначены?
- В чём отличие сеансов подключений от дейтаграмм?
- Для чего используется класс Socket?
- Как в программе можно создать подключение по протоколу UDP?
- Как в программе можно создать подключение по протоколу TCP?
- Для чего используется класс WebClient?
- Как получить необходимые данные из XML-структуры с помощью LINQ?
- Для чего предназначена технология Windows Communication Foundation?
- Как создать службу WCF?
- Как создать приложение для Windows Phone для использования методов службы WCF?
Упражнения
Для выполнения упражнений необходимо работающее сетевое подключение, а также среда Visual Studio для создания службы WCF.
Упражнение 1. Создание службы TimeTracker
В этом упражнении вы создадите службу, которая получает и хранит отчёты о встречах, получаемые от приложения TimeTrackerClient, работающего на удалённом устройстве. Служба будет предоставлять два метода: один — для получения отчётов о встречах, другой — для предоставления отчётов о встречах.
Создание службы
- Откройте Visual Studio.
- Выберите в главном меню пункт Файл -> Создать проект. Откроется диалоговое окно Создать проект.
- В списке Установленные шаблоны выберите в группе WCF шаблон Приложение службы WCF.
- Назовите проект TimeTrackerService и нажмите OK, чтобы создать проект. Visual Studio создаст новый проект и откроет файл Service1.svc.cs.
- Задайте службе и её интерфейсу более удобные имена. Для этого выберите в обозревателе решений файл IService1.cs, нажмите F2 и введите новое имя ITimeTrackerService.cs. При нажатии клавиши Enter Visual Studio предложит переименовать интерфейс и все ссылки на него, чтобы его имя соответствовало новому имени файла. Нажмите OK для подтверждения.
- Аналогичным образом переименуйте файл службы от Service1.svc в TimeTrackerService.svc.
- Откройте файл TimeTrackerService.svc.cs и щёлкните правой кнопкой по названию класса Service1. В контекстном меню выберите пункт Рефакторинг -> Переименовать…, укажите в открывшемся окне новое имя класса TimeTrackerService и подтвердите переименование.
Создание интерфейсов методов службы
Наша служба будет содержать два метода: один метод будет использовать удалённый клиент для сохранения отчёта о встрече, а другой будет возвращать список сохранённых встреч. Visual Studio автоматически создаёт некоторые методы, которые мы удалим из проекта.
- Откройте файл ITimeTrackerService.cs. Он содержит интерфейс, который описывает методы, предоставляемые службой.
- Удалите весь код внутри интерфейса и добавьте следующее описание методов:
[OperationContract] void SaveSession(string employeeName, string companyName, int startHour, int startMin, int endHour, int endMin); [OperationContract] string GetSessionList();
- Удалите описание класса CompositeType.
Создание методов службы
- Откройте файл TimeTrackerService.svc.cs.
- Удалите всё содержимое класса TimeTrackerService и добавьте в него следующий код:
Этот класс будет хранить информацию о каждой встрече, а также содержит список встреч, который будет формироваться во время работы службы. В реальном приложении этот список должен заполняться информацией из базы данных.
class Session { public string EmployeeName { get; set; } public string CompanyName { get; set; } public int StartHour { get; set; } public int StartMin { get; set; } public int EndHour { get; set; } public int EndMin { get; set; } public override string ToString() { return EmployeeName + " " + CompanyName; } } static List<Session> sessions = new List<Session>();
- Добавьте в класс TimeTrackerService следующие методы:
public void SaveSession(string employeeName, string companyName, int startHour, int startMin, int endHour, int endMin) { sessions.Add(new Session { EmployeeName = employeeName, CompanyName = companyName, StartHour = startHour, StartMin = startMin, EndHour = endHour, EndMin = endMin }); } public string GetSessionList() { StringBuilder result = new StringBuilder(); for (int i = 0; i < sessions.Count; i++) { result.AppendLine(sessions[i].ToString()); } return result.ToString(); }
Метод SaveSession сохраняет информацию о сеансе на сервере. Метод GetSessionList возвращает сохранённую информацию о встречах в виде многострочного текста.
Развёртывание службы
- Выберите в обозревателе решений файл TimeTrackerService.svc и нажмите F5 для запуска проекта. После построения решения откроется окно тестового клиента WCF.
- Дважды щёлкните мышью по методу SaveSession(). Введите следующие значения параметров метода:
- employeeName — Test Employee
- companyName — Test Company
- startHour — 1
- startMin — 2
- endHour —3
- endMin — 4
- Нажмите на кнопку Вызвать, чтобы вызвать метод службы с указанными параметрами. Метод вернёт пустое значение.
- Дважды щёлкните мышью по методу GetSessionList() и нажмите на кнопку Вызвать. Метод вернёт строку, соответствующую встрече, добавленной в систему при вызове метода SaveSession.
- Нажмите клавиши Shift + F5 для остановки службы.
- В обозревателе решений щёлкните правой кнопкой мыши по файлу TimeTrackerService.svc и выберите в контекстом меню пункт Просмотр в обозревателе. Обратите внимание на URL службы в адресной строке браузера — это значение понадобится для подключения к службе клиента:
В вашем случае номер порта может отличаться, поскольку Visual Studio генерирует его автоматически.
http://localhost:30975/TimeTrackerService.svc
- Закройте браузер и запустите службу в Visual Studio ещё раз. Запущенная служба будет использоваться в следующем упражнении.
Упражнение 2. Создание клиента службы
В этом упражнении мы создадим приложение, которое будет подключаться к созданной в предыдущем упражнении службе и использовать её методы.
Подключение клиентского приложения к службе
- Убедитесь в том, что созданная в предыдущем упражнении служба запущена.
- Запустите другую копию Visual Studio и откройте в ней проект TimeTrackerClient в папке Lab6 TimeTrackerClient. В текстовые поля пользователь может ввести имя сотрудника, название компании, с которой проводится встреча, а также время начала и окончания встречи. При нажатии на кнопку сохранить, программа должна сохранить информацию о встрече на сервере, и при нажатии на кнопку список встреч — вывести информацио о встречах, полученную от службы.
- В обозревателе решений щёлкните правой кнопкой мыши по элементу Ссылки и выберите пункт Добавить ссылку на службу….
- В открывшемся диалоговом окне Добавить ссылку на службу в поле Адрес введите URL службы, полученный в предыдущем упражнении в результате запуска службы, и нажмите кнопку Перейти. Visual Studio загрузит описание службы с сервера и выведет на экран информацию о службе.
- Откройте описание службы, щёлкнув по стрелке слева от её имени, и выберите имя интерфейса ITimeTrackerService. В поле операции будут отображены имена двух созданных методов службы.
- Измените пространство имён на TimeTrackerService и нажмите кнопку OK. Visual Studio добавит в проект ссылку на службу.
- Щёлкните правой кнопкой мыши по созданной ссылке на службу TimeTrackerService и выберите пункт Настроить ссылку на службу….
- В открывшемся диалоговом окне снимите галочку Повторно использовать типы в сборках, на которые есть ссылки и нажмите OK.
Использование метода службы SaveSession в приложении
- Откройте файл MainPage.xaml.cs.
- Добавьте в начало объявления класса следующую строку:
private TimeTrackerService.TimeTrackerServiceClient timeTracker;
- Добавьте в конструктор класса после вызова метода InitializeComponent следующий код для создания связанного со службой объекта и обработчиков событий службы (для создания обработчиков событий можно использовать Intellisense — в этом случае автоматически будет создана большая часть кода):
timeTracker = new TimeTrackerService.TimeTrackerServiceClient(); timeTracker.SaveSessionCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>( timeTracker_SaveSessionCompleted); timeTracker.GetSessionListCompleted += new EventHandler<TimeTrackerService.GetSessionListCompletedEventArgs>( timeTracker_GetSessionListCompleted);
- Добавьте код метода saveButton_Click для асинхронного вызова метода службы и передачи введённых пользователем значений:
private void saveButton_Click(object sender, RoutedEventArgs e) { int startHour, startMin, endHour, endMin; if (int.TryParse(startHourTextBox.Text, out startHour) && int.TryParse(startMinTextBox.Text, out startMin) && int.TryParse(endHourTextBox.Text, out endHour) && int.TryParse(endMinTextBox.Text, out endMin)) { timeTracker.SaveSessionAsync(employeeNameTextBox.Text, companyNameTextBox.Text, startHour, startMin, endHour, endMin); } }
- Добавьте код метода-обработчика timeTracker_SaveSessionCompleted, который будет вызываться при завершении выполнения метода службы:
void timeTracker_SaveSessionCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) { if (!e.Cancelled) { employeeNameTextBox.Text = "Введите имя сотрудника..."; companyNameTextBox.Text = "Введите название компании..."; } }
Если метод службы выполнится успешно, то текст в текстовых полях приложения будет изменён на первоначальный.
Тестирование метода SaveSession
- Нажмите F5, чтобы запустить программу в эмуляторе.
- Введите в текстовые поля информацию о встрече и нажмите на кнопку сохранить. Текст в текстовых полях должен измениться на первоначальный.
- Таким же образом добавьте информацию о второй встрече.
- Остановите выполнение программы.
Использование метода службы GetSessionList
- Добавьте в приложение код метода listButton_click для вызова метода службы:
private void listButton_Click(object sender, RoutedEventArgs e) { timeTracker.GetSessionListAsync(); }
- Добавьте в приложение код метода timeTracker_GetSessionListCompleted для вывода на экран результата выполнения метода службы:
void timeTracker_GetSessionListCompleted(object sender, TimeTrackerService.GetSessionListCompletedEventArgs e) { if (!e.Cancelled) { sessionsTextBlock.Text = e.Result; } }
- Запустите программу и нажмите кнопку список встреч. На экран будет выведена информация о двух введённых встречах.