Опубликован: 12.02.2013 | Уровень: для всех | Доступ: платный
Лекция 7:

Средства 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 необходимо обрабатывать исключения в блоке trycatch и выдавать пользователю сообщение о недоступности сети.

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

Краткие итоги

  1. Компьютерные сети предоставляют возможность отправки сообщений из одной системы в другую. Устройства могут объединяться в локальную сеть. В локальной сети может быть маршрутизатор, который отправляет пакеты из локальной сети удалённым узлах. Маршрутизаторы являются устройствами передачи данных, которые позволяют создавать межсетевые подключения.
  2. Полный адрес системы в сети содержит адрес этой станции в её локальной сети и адрес этой сети в Интернете.
  3. Данные могут передаваться между системами в виде отдельных дейтаграмм (UDP) или как часть подключения между двумя системами (TCP).
  4. К различным службам системы можно обращаться, указав номер порта, на котором работает требуемая служба. Некоторые номера портов зарезервированы и являются общепринятыми, например веб-сервер обычно работает на порту с номером 80.
  5. Приложения Windows Phone могут создавать и использовать объекты, которые представляют подключение к сетевой службе. Эти объекты работают в асинхронном режиме, при котором сетевые операции выполняются в отдельном потоке. Результаты асинхронного запроса обрабатываются при наступлении события окончания выполнения запроса без необходимости ожидания завершения запроса в программе.
  6. Сокеты являются абстракцией сетевого подключения.
  7. Некоторые сетевые вызовы могут возвращать структурированные данные, которые содержат XML-описание содержимого.
  8. Библиотеки LINQ могут создавать динамические объекты для представления структурированных данных и их использования в программе.
  9. Технология Windows Communication Foundation (WCF) предоставляет возможность настроить сервер так, чтобы можно было вызывать их методы в клиентских приложениях.
  10. Клиентское приложение может прочитать описание службы, которое предоставляет сервер WCF, и использовать его для создания прокси-объекта, который содержит методы, предоставляемые службой. При вызове в клиентском коде метод прокси-объекта запускается сетевая операция, которая передаёт параметры метода на сервер. Затем вызывается метод сервера, и сетевая операция возвращает результат коду, который вызвал серверный метод.

Ключевые термины

IP-адрес — уникальный сетевой адрес узла в компьютерной сети, построенной по протоколу IP.

Windows Communication Foundation — технология компании Microsoft, основанная на .NET Framework, которая используется для обмена данными между приложениями, находящихся обычно на разных устройствах.

Асинхронное подключение — тип подключения, которое работает паралллельно с основной программой и обычно обрабатывается в отдельном потоке.

Брандмауэр — комплекс аппаратных или программных средств, осуществляющий контроль и фильтрацию проходящих через него сетевых пакетов в соответствии с заданными правилами.

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

Конечная точка подключения — удалённый узел, к которому подключается программа на текущем узле.

Маршрутизация — процесс определения маршрута следования информации в сетях связи.

Октетами — наименьшая единица информации, которая может быть передана по сети, равняется 8 битам.

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

Сетевой маршрутизатор — сетевое устройство, пересылающее пакеты данных между различными сегментами сети.

Сетевой протокол — набор соглашений, которые определяют, как происходит обмен данными между устройствами в сети.

Сетевые сигналы — носитель информации, которая передаётся через компьютеную сеть.

Система доменных имён — компьютерная распределённая система для получения информации о доменах, позволяет связать имя узла с его IP-адресом.

Широковещательный адрес — условный адрес, который используется для передачи широковещательных пакетов в компьютерных сетях. Широковещательный адрес не может быть присвоен какому-либо узлу сети.

Вопросы

  1. Какие типы подключений к сети доступны в Windows Phone?
  2. Какие образом данные передаются по сети?
  3. Для чего используется система доменных имён?
  4. Каким образом несколько взаимодействующих с сетью служб могут работать на одном сервере только с теми сообщениями, которые для них предназначены?
  5. В чём отличие сеансов подключений от дейтаграмм?
  6. Для чего используется класс Socket?
  7. Как в программе можно создать подключение по протоколу UDP?
  8. Как в программе можно создать подключение по протоколу TCP?
  9. Для чего используется класс WebClient?
  10. Как получить необходимые данные из XML-структуры с помощью LINQ?
  11. Для чего предназначена технология Windows Communication Foundation?
  12. Как создать службу WCF?
  13. Как создать приложение для Windows Phone для использования методов службы WCF?

Упражнения

Для выполнения упражнений необходимо работающее сетевое подключение, а также среда Visual Studio для создания службы WCF.

Упражнение 1. Создание службы TimeTracker

В этом упражнении вы создадите службу, которая получает и хранит отчёты о встречах, получаемые от приложения TimeTrackerClient, работающего на удалённом устройстве. Служба будет предоставлять два метода: один — для получения отчётов о встречах, другой — для предоставления отчётов о встречах.

Создание службы

  1. Откройте Visual Studio.
  2. Выберите в главном меню пункт Файл -> Создать проект. Откроется диалоговое окно Создать проект.
  3. В списке Установленные шаблоны выберите в группе WCF шаблон Приложение службы WCF.
  4. Назовите проект TimeTrackerService и нажмите OK, чтобы создать проект. Visual Studio создаст новый проект и откроет файл Service1.svc.cs.
  5. Задайте службе и её интерфейсу более удобные имена. Для этого выберите в обозревателе решений файл IService1.cs, нажмите F2 и введите новое имя ITimeTrackerService.cs. При нажатии клавиши Enter Visual Studio предложит переименовать интерфейс и все ссылки на него, чтобы его имя соответствовало новому имени файла. Нажмите OK для подтверждения.
  6. Аналогичным образом переименуйте файл службы от Service1.svc в TimeTrackerService.svc.
  7. Откройте файл TimeTrackerService.svc.cs и щёлкните правой кнопкой по названию класса Service1. В контекстном меню выберите пункт Рефакторинг -> Переименовать…, укажите в открывшемся окне новое имя класса TimeTrackerService и подтвердите переименование.

Создание интерфейсов методов службы

Наша служба будет содержать два метода: один метод будет использовать удалённый клиент для сохранения отчёта о встрече, а другой будет возвращать список сохранённых встреч. Visual Studio автоматически создаёт некоторые методы, которые мы удалим из проекта.

  1. Откройте файл ITimeTrackerService.cs. Он содержит интерфейс, который описывает методы, предоставляемые службой.
  2. Удалите весь код внутри интерфейса и добавьте следующее описание методов:
    [OperationContract]
    void SaveSession(string employeeName, string companyName, int startHour, int startMin,
        int endHour, int endMin);
    
    [OperationContract]
    string GetSessionList();
    
  3. Удалите описание класса CompositeType.

Создание методов службы

  1. Откройте файл TimeTrackerService.svc.cs.
  2. Удалите всё содержимое класса 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>();
    
    Этот класс будет хранить информацию о каждой встрече, а также содержит список встреч, который будет формироваться во время работы службы. В реальном приложении этот список должен заполняться информацией из базы данных.
  3. Добавьте в класс 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 возвращает сохранённую информацию о встречах в виде многострочного текста.

Развёртывание службы

  1. Выберите в обозревателе решений файл TimeTrackerService.svc и нажмите F5 для запуска проекта. После построения решения откроется окно тестового клиента WCF.
  2. Дважды щёлкните мышью по методу SaveSession(). Введите следующие значения параметров метода:
    • employeeNameTest Employee
    • companyNameTest Company
    • startHour — 1
    • startMin — 2
    • endHour —3
    • endMin — 4
  3. Нажмите на кнопку Вызвать, чтобы вызвать метод службы с указанными параметрами. Метод вернёт пустое значение.
  4. Дважды щёлкните мышью по методу GetSessionList() и нажмите на кнопку Вызвать. Метод вернёт строку, соответствующую встрече, добавленной в систему при вызове метода SaveSession.
  5. Нажмите клавиши Shift + F5 для остановки службы.
  6. В обозревателе решений щёлкните правой кнопкой мыши по файлу TimeTrackerService.svc и выберите в контекстом меню пункт Просмотр в обозревателе. Обратите внимание на URL службы в адресной строке браузера — это значение понадобится для подключения к службе клиента:
    http://localhost:30975/TimeTrackerService.svc
    
    В вашем случае номер порта может отличаться, поскольку Visual Studio генерирует его автоматически.
  7. Закройте браузер и запустите службу в Visual Studio ещё раз. Запущенная служба будет использоваться в следующем упражнении.

Упражнение 2. Создание клиента службы

В этом упражнении мы создадим приложение, которое будет подключаться к созданной в предыдущем упражнении службе и использовать её методы.

Подключение клиентского приложения к службе

  1. Убедитесь в том, что созданная в предыдущем упражнении служба запущена.
  2. Запустите другую копию Visual Studio и откройте в ней проект TimeTrackerClient в папке Lab6 TimeTrackerClient. В текстовые поля пользователь может ввести имя сотрудника, название компании, с которой проводится встреча, а также время начала и окончания встречи. При нажатии на кнопку сохранить, программа должна сохранить информацию о встрече на сервере, и при нажатии на кнопку список встреч — вывести информацио о встречах, полученную от службы.
  3. В обозревателе решений щёлкните правой кнопкой мыши по элементу Ссылки и выберите пункт Добавить ссылку на службу….
  4. В открывшемся диалоговом окне Добавить ссылку на службу в поле Адрес введите URL службы, полученный в предыдущем упражнении в результате запуска службы, и нажмите кнопку Перейти. Visual Studio загрузит описание службы с сервера и выведет на экран информацию о службе.
  5. Откройте описание службы, щёлкнув по стрелке слева от её имени, и выберите имя интерфейса ITimeTrackerService. В поле операции будут отображены имена двух созданных методов службы.
  6. Измените пространство имён на TimeTrackerService и нажмите кнопку OK. Visual Studio добавит в проект ссылку на службу.
  7. Щёлкните правой кнопкой мыши по созданной ссылке на службу TimeTrackerService и выберите пункт Настроить ссылку на службу….
  8. В открывшемся диалоговом окне снимите галочку Повторно использовать типы в сборках, на которые есть ссылки и нажмите OK.

Использование метода службы SaveSession в приложении

  1. Откройте файл MainPage.xaml.cs.
  2. Добавьте в начало объявления класса следующую строку:
    private TimeTrackerService.TimeTrackerServiceClient timeTracker;
    
  3. Добавьте в конструктор класса после вызова метода InitializeComponent следующий код для создания связанного со службой объекта и обработчиков событий службы (для создания обработчиков событий можно использовать Intellisense — в этом случае автоматически будет создана большая часть кода):
    timeTracker = new TimeTrackerService.TimeTrackerServiceClient();
    
    timeTracker.SaveSessionCompleted +=
        new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(
        timeTracker_SaveSessionCompleted);
    
    timeTracker.GetSessionListCompleted +=
        new EventHandler<TimeTrackerService.GetSessionListCompletedEventArgs>(
        timeTracker_GetSessionListCompleted);
    
  4. Добавьте код метода 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);
        }
    }
    
  5. Добавьте код метода-обработчика timeTracker_SaveSessionCompleted, который будет вызываться при завершении выполнения метода службы:
    void timeTracker_SaveSessionCompleted(object sender,
        System.ComponentModel.AsyncCompletedEventArgs e)
    {
        if (!e.Cancelled)
        {
            employeeNameTextBox.Text = "Введите имя сотрудника...";
            companyNameTextBox.Text = "Введите название компании...";
        }
    }

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

Тестирование метода SaveSession

  1. Нажмите F5, чтобы запустить программу в эмуляторе.
  2. Введите в текстовые поля информацию о встрече и нажмите на кнопку сохранить. Текст в текстовых полях должен измениться на первоначальный.
  3. Таким же образом добавьте информацию о второй встрече.
  4. Остановите выполнение программы.

Использование метода службы GetSessionList

  1. Добавьте в приложение код метода listButton_click для вызова метода службы:
    private void listButton_Click(object sender, RoutedEventArgs e)
    {
        timeTracker.GetSessionListAsync();
    }
    
  2. Добавьте в приложение код метода timeTracker_GetSessionListCompleted для вывода на экран результата выполнения метода службы:
    void timeTracker_GetSessionListCompleted(object sender,
        TimeTrackerService.GetSessionListCompletedEventArgs e)
    {
        if (!e.Cancelled)
        {
            sessionsTextBlock.Text = e.Result;
        }
    }
    
  3. Запустите программу и нажмите кнопку список встреч. На экран будет выведена информация о двух введённых встречах.
park mr
park mr
Таиланд, thai
An Nguyen
An Nguyen
Вьетнам, 30/9 Thong Nhat street, ward 13, Go Vap district