Лекция 6 Раздел 6.1 Темы раздела 3 Windows Phone Сигналы в Windows Phone Программы Windows Phone Интерфейс сетевого программирования Wi-Fi Сотовая сеть USB 4 Windows Phone Классы NetworkInformation using Microsoft.Phone.Net.NetworkInformation; 5 Windows Phone Получение информации о сети if (DeviceNetworkInformation.IsWiFiEnabled) { // Wi-Fi доступен } 6 Windows Phone Сети и устройства 7 Windows Phone Сетевые пакеты 8 Windows Phone Сетевые адреса 9 Windows Phone Адресация в Интернете 10 Windows Phone Маршрутизация 11 Windows Phone Маршрутизация 12 Windows Phone Сетевые протоколы 13 Windows Phone Адресация устройств 14 Windows Phone Адресация подсетей 15 Windows Phone Сетевые порты 16 Windows Phone Общепринятые порты 17 Windows Phone Дейтаграммы 18 Windows Phone Сеансы подключения 19 Windows Phone UDP и TCP 20 Windows Phone Краткие итоги 21 Windows Phone Раздел 6.2 Темы раздела 23 Windows Phone Протокол UDP 24 Windows Phone Служба echo 25 Windows Phone Отправка сообщения public string SendMessageUDP(string message, string hostUrl, int portNumber) { } ... string resp; resp = SendMessageUDP(message, hostUrl, portNumber); 26 Windows Phone Класс Socket using System.Net.Sockets; 27 Windows Phone Создание подключения Socket hostSocket = null; ... hostSocket = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 28 Windows Phone Установка системы адресации Socket hostSocket = null; ... hostSocket = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 29 Windows Phone Установка типа подключения Socket hostSocket = null; ... hostSocket = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 30 Windows Phone Установка типа протокола Socket hostSocket = null; ... hostSocket = new Socket( AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 31 Windows Phone Класс SocketAsyncEventArgs SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgs(); 32 Windows Phone Задание конечной точки socketEventArgs.RemoteEndPoint = new DnsEndPoint(hostUrl, portNumber, AddressFamily.InterNetwork); 33 Windows Phone Адрес удалённой системы socketEventArgs.RemoteEndPoint = new DnsEndPoint(hostUrl, portNumber, AddressFamily.InterNetwork); 34 Windows Phone Определение порта socketEventArgs.RemoteEndPoint = new DnsEndPoint(hostUrl, portNumber, AddressFamily.InterNetwork); 35 Windows Phone Определение схемы адресации socketEventArgs.RemoteEndPoint = new DnsEndPoint(hostUrl, portNumber, AddressFamily.InterNetwork); 36 Windows Phone Кодирование сообщения 37 Windows Phone Использование класса Encoding using System.Text; ... byte[] messageBytes = Encoding.UTF8.GetBytes(message); 38 Windows Phone Асинхронные операции 39 Windows Phone Событие Completed socketEventArgs.Completed += new EventHandler<SocketAsyncEventArgs> (delegate(object s, SocketAsyncEventArgs e) { // код в этом блоке выполняется, // когда происходит событие Completed }); 40 Windows Phone Проверка результата socketEventArgs.Completed += new EventHandler<SocketAsyncEventArgs> (delegate(object s, SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success) resp = ""; else resp = e.SocketError.ToString(); }); 41 Windows Phone Проверка результата socketEventArgs.Completed += new EventHandler<SocketAsyncEventArgs> (delegate(object s, SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success) resp = ""; else resp = e.SocketError.ToString(); }); 42 Windows Phone Асинхронные операции и потоки 43 Windows Phone Синхронизация потоков using System.Threading; ... static ManualResetEvent transferDoneFlag = new ManualResetEvent(false); 44 Windows Phone Установка флага socketEventArgs.Completed += new EventHandler<SocketAsyncEventArgs> (delegate(object s, SocketAsyncEventArgs e) { // запустить все ожидающие потоки transferDoneFlag.Set(); }); 45 Windows Phone Использование флага transferDoneFlag.WaitOne(); 46 Windows Phone Использование тайм-аута transferDoneFlag.WaitOne(MESSAGE_TIMEOUT_MSECS); 47 Windows Phone Отправка сообщения transferDoneFlag.Reset(); hostSocket.SendToAsync(socketEventArgs); transferDoneFlag.WaitOne(MESSAGE_TIMEOUT_MSECS); 48 Windows Phone Получение сообщения public string ReceiveMessageUDP(int portNumber, out string result) { ... } 49 Windows Phone Адресация входящих сообщений socketEventArgs.RemoteEndPoint = new IPEndPoint(IPAddress.Any, portNumber); 50 Windows Phone Декодирование сообщения byte[] responseBytes = new Byte[MAX_BUFFER_SIZE]; socketEventArgs.SetBuffer(responseBytes, 0, MAX_BUFFER_SIZE); message = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred); message = message.Trim('\0'); 51 Windows Phone Отправка и получение string resp; string echo; resp = SendMessageUDP("Hello", "host.com", 7); if (resp.Length == 0) { resp = ReceiveMessageUDP(7, out echo); } 52 Windows Phone Краткие итоги 53 Windows Phone Раздел 6.3 Темы раздела 55 Windows Phone Протоколы TCP и HTTP 56 Windows Phone Получение веб-страницы private string RequestWebPage(string url, string page, out string pageContent) { ... } string resp; string page; resp = RequestWebPage (“host.com", "index.html", out page); 57 Windows Phone Создание TCP-подключения hostSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // создание подключения hostSocket.ConnectAsync(socketEventArg); 58 Windows Phone Запрос веб-страницы response = SendMessageTCP("GET " + page + " HTTP/1.1\r\nHost: " + url + "\r\nConnection: Close\r\n\r\n"); 59 Windows Phone Получение ответного сообщения response = ReceiveMessageTCP(out fetchText); 60 Windows Phone Получение нескольких сообщений do { response = ReceiveMessageTCP(out fetchText); if (response != "") { CloseTCP(); return response; } wholePage = wholePage + fetchText; } while (fetchText != ""); 61 Windows Phone Закрытие подключения void CloseTCP() { if (hostSocket != null) { hostSocket.Close(); hostSocket = null; } } 62 Windows Phone Краткие итоги 63 Windows Phone Раздел 6.4 Класс WebClient 65 Windows Phone Создание WebClient WebClient client; // конструктор страницы приложения public MainPage() { InitializeComponent(); client = new WebClient(); client.DownloadStringCompleted += new DownloadStringCompletedEventHandler( client_DownloadStringCompleted); } 66 Windows Phone Создание обработчика события WebClient client; // конструктор страницы приложения public MainPage() { InitializeComponent(); client = new WebClient(); client.DownloadStringCompleted += new DownloadStringCompletedEventHandler( client_DownloadStringCompleted); } 67 Windows Phone Отображение результатов void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { if (e.Error == null) { pageTextBlock.Text = e.Result; } } 68 Windows Phone Отправка запроса private void loadButton_Click(object sender, RoutedEventArgs e) { client.DownloadStringAsync(new Uri(urlTextBox.Text)); } 69 Windows Phone Краткие итоги 70 Windows Phone Раздел 6.5 Темы раздела 72 Windows Phone Чтение сообщений Twitter 73 Windows Phone Чтение сообщений Twitter private void loadButton_Click(object sender, RoutedEventArgs e) { string url = "http://twitter.com/statuses/user_timeline/" + nameTextBox.Text + ".xml"; client.DownloadStringAsync(new Uri(url)); } 74 Windows Phone Структурированные данные 75 Windows Phone Структура информации Twitter <?xml version="1.0" encoding="UTF-8"?> <statuses type="array"> <status> <created_at>Tue Oct 12 11:57:37 +0000 2010</created_at> <text> Hello from Twitter.</text> <user> <id>2479801</id> <name>Rob Miles</name> <profile_background_image_url> http://s.twimg.com/a/1286/images/themes/theme1/bg.png </profile_background_image_url> </user> </status> </statuses> 76 Windows Phone Выполнение запроса LINQ XElement TwitterElement = XElement.Parse(twitterText); 77 Windows Phone Класс для представления данных public class TwitterPost { public string PostText { get; set; } public string DatePosted { get; set; } public string UserImage { get; set; } } 78 Windows Phone Создание запроса LINQ var postList = from tweet in twitterElements.Descendants("status") select new TwitterPost { UserImage = tweet.Element("user"). Element("profile_image_url").Value, PostText = tweet.Element("text").Value, DatePosted = tweet.Element("created_at").Value }; 79 Windows Phone Поиск XML-элементов var postList = from tweet in twitterElements.Descendants("status") select new TwitterPost { UserImage = tweet.Element("user"). Element("profile_image_url").Value, PostText = tweet.Element("text").Value, DatePosted = tweet.Element("created_at").Value }; 80 Windows Phone Внешний вид сообщений 81 Windows Phone Шаблон разметки сообщения <StackPanel Orientation="Horizontal" Height="132"> <Image Source="{Binding UserImage}" Height="73" Width="73" VerticalAlignment="Top" /> <StackPanel Width="370"> <TextBlock Text="{Binding DatePosted}" Foreground="#FFC8AB14" FontSize="22" /> <TextBlock Text="{Binding PostText}" TextWrapping="Wrap" FontSize="24" /> </StackPanel> </StackPanel> 82 Windows Phone Фотография <StackPanel Orientation="Horizontal" Height="132"> <Image Source="{Binding UserImage}" Height="73" Width="73" VerticalAlignment="Top" /> <StackPanel Width="370"> <TextBlock Text="{Binding DatePosted}" Foreground="#FFC8AB14" FontSize="22" /> <TextBlock Text="{Binding PostText}" TextWrapping="Wrap" FontSize="24" /> </StackPanel> </StackPanel> 83 Windows Phone Сообщение <StackPanel Orientation="Horizontal" Height="132"> <Image Source="{Binding UserImage}" Height="73" Width="73" VerticalAlignment="Top" /> <StackPanel Width="370"> <TextBlock Text="{Binding DatePosted}" Foreground="#FFC8AB14" FontSize="22" /> <TextBlock Text="{Binding PostText}" TextWrapping="Wrap" FontSize="24" /> </StackPanel> </StackPanel> 84 Windows Phone Полный код списка ListBox <ListBox Height="442" HorizontalAlignment="Left" Name="tweetsListBox" VerticalAlignment="Top" Width="468"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal" Height="132"> <Image Source="{Binding UserImage}" Height="73" Width="73" VerticalAlignment="Top" /> <StackPanel Width="370"> <TextBlock Text="{Binding DatePosted}" Foreground="#FFC8AB14" FontSize="22" /> <TextBlock Text="{Binding PostText}" TextWrapping="Wrap" FontSize="24" /> </StackPanel> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> 85 Windows Phone Указание источника данных tweetsListBox.ItemsSource = postList; 86 Windows Phone Краткие итоги 87 Windows Phone Раздел 6.6 Темы раздела 89 Windows Phone Службы и прокси-объекты Сетевая служба Проксиобъект 90 Windows Phone Создание службы 91 Windows Phone Служба «Новость дня» [ServiceContract] public interface INewsOfTheDayService { [OperationContract] string GetData (int value); } 92 Windows Phone Атрибуты Contract [ServiceContract] public interface IJokeOfTheDayService { [OperationContract] string GetJoke(int jokeStrength); } 93 Windows Phone Метод службы «Новость дня» public class NewsOfTheDayService : INewsOfTheDayService { public string GetData(int value) { string result; switch (value) { case 1: result = "Новость 1"; break; case 2: result = "Новость 2"; break; case 3: result = "Новость 3"; break; default: result = "Выбрана несуществующая категория"; break; } return result; } } 94 Windows Phone Запуск службы в Visual Studio 95 Windows Phone Описание службы 96 Windows Phone Создание ссылки на службу 97 Windows Phone Создание прокси-объекта NewsOfTheDayService.NewsOfTheDayServiceClient newsclient; // Конструктор public MainPage() { InitializeComponent(); newsclient = new NewsOfTheDayService.NewsOfTheDayServiceClient(); jokeService.GetDataCompleted += new EventHandler<NewsOfTheDayService. GetDataCompletedEventArgs> (newsclient _GetJokeCompleted); } 98 Windows Phone Вывод результатов void newsclient_GetDataCompleted(object sender, NewsOfTheDayService.GetDataCompletedEventArgs e) { if (!e.Cancelled) { newsTextBlock.Text = e.Result; } } 99 Windows Phone Вызов метода службы private void getNewsButton_Click(object sender, RoutedEventArgs e) { int category = 0; if (int.TryParse(strengthTextBox.Text, out category)) { newsclient.GetJokeAsync(category); } } 100 Windows Phone Краткие итоги 101 Windows Phone