Лекция 6

advertisement
Лекция 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
Download