Управление событиями сетевого подключения и изменениями доступности (HTML)

[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]

В этом разделе показано, как регистрироваться для получения уведомлений об изменениях состояния сетевого подключения и как получать информацию о текущем состоянии при помощи классов в пространстве имен Windows.Networking.Connectivity.

Мы также предоставим рекомендации по поведению приложения, которое должно поддерживать единый механизм взаимодействия с пользователем в разных сетевых сценариях.

Необходимые условия

В следующих примерах, основанных на образце с информацией о сети, используется JavaScript. Общую справку по созданию приложения среды выполнения Windows на JavaScript см. в разделе Создание первого приложения среды выполнения Windows на JavaScript.

Важно понимание класса ConnectionProfile и способов доступа к представленной в нем информации. Подробнее см. в статье о том, как получить информацию о сетевом подключении. Чтобы получить дополнительные примеры кода, скачайте пример Network Information.

Что считается событием изменения состояния подключения?

Событием изменения состояния подключения считается изменение доступности, типа или стоимости соединения, предлагаемого отдельным подключением. В новейших подключенных приложениях часто возникают сценарии перемещения по сети, типичные для мобильных устройств. Когда среда выполнения Windows обнаруживает новую сеть, она автоматически предлагает ее как новый вариант подключения. Например, если пользователь использует устройство в сети 3G/4G для потоковой передачи данных, а затем попадает в зону действия сети Wi-Fi, приложение может использовать новый вариант подключения. Разумеется, это также означает, что пользователь может выходить из зоны действия сети, даже если она в данный момент используется.

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

Регистрация для получения уведомлений о событиях изменения состояния подключения

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

При вызове большинства асинхронных сетевых методов вы должны написать код для обработки исключений. Методы в пространстве имен Windows.Networking.Connectivity, регистрирующиеся для получения уведомлений о событиях или пытающиеся извлечь ConnectionProfile, могут вызывать исключения. Обработчик исключений может получить подробную информацию о причине исключения, чтобы разобраться в проблеме и принять необходимые меры. Подробнее см. в разделе об обработке исключений в сетевых приложениях.


// Define some variables used

// A variable to store network status change information
var internetProfileInfo = "";

// A  boolean to keep track of registration for network status change notifications
var registeredNetworkStatusNotif = false;

var networkInfo = Windows.Networking.Connectivity.NetworkInformation;

//Register for Network Status Change notifications, and display new Internet Connection Profile information on network status change
function registerForNetworkStatusChangeNotif() {

    // register for network status change notifications
    if (!registeredNetworkStatusNotif) {
        try {
            networkInfo.addEventListener("networkstatuschanged", onNetworkStatusChange);
            registeredNetworkStatusNotif = true;

            if (internetProfileInfo === "") {
                mySample.displayStatus("No network status change. ", "sample", "status");
        }
        catch (e) {
            mySample.displayError("An unexpected exception occured: " + e.name + ": " + e.message);
        }
    }
}

При изменении сетевого сценария приложению может потребоваться отменить регистрацию для получения уведомлений об изменении состояния сети (если оно уже зарегистрировалось) и затем заново зарегистрироваться для нового сценария.

//Unregister for Network Status Change notifications
function unRegisterForNetworkStatusChangeNotif() {
    try {
        networkInfo.removeEventListener("networkstatuschanged", onNetworkStatusChange);
        internetProfileInfo = "";
    }
    catch (e) {
        mySample.displayError("An unexpected exception occured: " + e.name + ": " + e.message, "sample", "error");
    }
}

Получение информации об изменении состояния подключения

Следующий пример обработчика событий извлекает связанный ConnectionProfile для текущего профиля подключения к Интернету, когда состояние сети изменяется. ConnectionProfile можно использовать для получения и отображения информации о состоянии подключения, включая текущую область, тип и стоимость подключения в соответствии с NetworkConnectivityLevel, NetworkTypes и NetworkCostType.

// Event handler for Network Status Change event
function onNetworkStatusChange(sender) {

    //network status changed
    internetProfileInfo = "Network Status Changed: \n\r";

    try {
        // get the ConnectionProfile that is currently used to connect to the Internet
        var internetProfile = networkInfo.getInternetConnectionProfile();
        if (internetProfile === null) {
            mySample.displayStatus("Not connected to Internet\n\r");
        }
        else {
            internetProfileInfo += getConnectionProfileInfo(internetProfile) + "\n\r";
            mySample.displayStatus(internetProfileInfo);
        }
        internetProfileInfo = "";
    }
    catch (e) {
            mySample.displayError("An unexpected exception occured: " + e.name + ": " + e.message, "sample", "error");
    }
}

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

Рекомендуемая обработка изменений состояния подключения приложением

Следующая таблица содержит основные сценарии изменений состояния подключения и рекомендации по поведению приложения.

Сценарий Рекомендуемое поведение
Потеря соединения в результате ошибки

Подключение может быть восстановлено в простой повторной попытке выполнения сетевой операции. Если такая попытка завершается неудачей, следует ожидать события networkstatuschanged для получения текущей информации о состоянии подключения. Мы рекомендуем, чтобы подключение использовало экспоненциально возрастающий интервал отхода между повторением попыток, начинающийся со значения 50 миллисекунд.

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

Проинформировать пользователя о том, что подключение было потеряно, а затем зарегистрироваться для события networkstatuschanged и ожидать его.

Доступность новой сети

Для мобильных устройств нередко встречаются сценарии, включающие перемещение устройства по нескольким общедоступным и частным сетям. Например, пользователь может подключиться к мобильной широкополосной сети и общаться с друзьями с помощью приложения для обмена сообщениями, а потом прийти домой и подключиться к сети с неограниченным доступом. Политика по умолчанию в Windows 8, Windows Server 2012, Windows Phone 8.1 и более поздних версиях ОС: сеть с неограниченным доступом предпочтительнее сети с лимитным тарифным планом, а более быстрая сеть предпочтительнее более медленной сети. Однако существующие подключения, установленные приложением, не будут автоматически переключаться на новую сеть. Требуется участие приложения, поскольку приложение может лучше решить, следует ли переключиться на новую сеть.

Если скачивание видеопотока близко к завершению, переключение на новую сеть не будет иметь смысла, так как скачивание начнется заново. Однако если текущая сеть теряет пакеты, работает слишком медленно или потоку для завершения требуется дополнительное время, лучше переключиться на новую сеть.

Если вы определили, что для сценария вашего приложения желательно переключиться между сетями, следуйте следующим рекомендациям при обнаружении новой сети.

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

2. Если повторная попытка использования сети успешна, завершите работу в предыдущей сети.

Изменение стоимости сетевого подключения

У мобильных сетей особенно часто встречаются весьма специфические ограничения на использование сети. Если в приложении возникает изменение стоимости подключения из-за использования более 80 % данных высокоскоростным мобильным подключением, переменных затрат или роуминга, адаптируйте поведение приложения, как подробно описано в разделе Как управлять тарифными ограничениями в сети с лимитным тарифным планом.

 

Примечание  Опытные разработчики также могут оптимизировать поведение приложения при повторной попытке выполнения сетевых операций. Например, можно заменить существующее подключение новым подключением через более быструю сеть. В этом случае разработчик может использовать API сокетов, например StreamSocketInformation.bandwidthStatistics, чтобы определить целесообразность перехода на другое подключение.

 

Сводка

В этом разделе мы рассмотрели, как зарегистрироваться для получения уведомлений о событиях изменения состояния подключения и как использовать эти уведомления для получения информации о текущем состоянии от профиля ConnectionProfile, для которого произошло событие. Мы также рассмотрели рекомендуемое поведение приложения для наиболее распространенных сценариев смены состояния.

Хотя в данном разделе речь идет о доступности сети, в сценариях подключения к сетям с лимитным тарифным планом событие networkstatuschanged может также представлять изменение стоимости и тарифного плана. Подробности и рекомендации по оптимальному изменению поведения приложения в описанных сценариях см. в разделе Как управлять тарифными ограничениями в сети с лимитным тарифным планом.

Связанные разделы

Прочие ссылки

Создание первого приложения среды выполнения Windows на JavaScript

Обработка исключений в сетевых приложениях

Как управлять тарифными ограничениями в сети с лимитным тарифным планом

Получение сведений о сетевом адаптере и его размещении

Как получить информацию о сетевом подключении

Получение данных об использовании подключения за определенный период

Ссылки

ConnectionProfile

NetworkInformation

networkstatuschanged

networkStatusChangedEventHandler

Windows.Networking.Connectivity

Примеры

Пример Network information

Пример Network status background