Настройка времени ожидания при выполнении операций с сокетами (HTML)

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

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

Что необходимо знать

Технологии

  • Windows.Networking.Sockets

    Устанавливает сетевые подключения с использованием сокетов и протоколов WebSocket.

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

  • Следующая информация применима к любому подключенному или поддерживающему работу в сети приложению среды выполнения Windows, которое использует сокеты для сетевых подключений. Сведения этого раздела применимы к приложениям на JavaScript для Windows 8.1, Windows Phone 8.1 и Windows Server 2012.

  • Следующие примеры этого раздела написаны на JavaScript. Рекомендуется иметь базовое представление о сокетах.

Инструкции

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

Класс StreamSocket реализует TCP-сокет в приложениях среды выполнения Windows. TCP-сокет должен установить связь перед отправкой или получением сетевых данных. Реализация базового TCP-сокета в Windows 8.1, Windows Phone 8.1 и Windows Server 2012 задает время ожидания по умолчанию для всех операций, связанных с TCP-сокетом. При использовании имен узлов или конечных точек время ожидания по умолчанию равно 3 минутам (180 секундам) для каждой пары адреса источника и назначения. Поэтому если имя узла назначения имеет два IP-адреса, то время ожидания операции подключения будет составлять примерно 6 минут. Это значение времени ожидания по умолчанию может быть избыточным при использовании приложения среды выполнения Windows. Поэтому для приложения, использующего класс StreamSocket, можно задать меньшее значение времени ожидания по умолчанию для операций подключения с помощью сокета потока.

При отправке или получении сетевых данных для классов DatagramSocket и StreamSocket не задается значение времени ожидания по умолчанию. Поэтому ожидание операции отправки или получения будет продолжаться бесконечно. В использующем сокеты приложении среды выполнения Windows для оптимизации взаимодействия с пользователем можно задать время ожидания для этих операций.

Время прослушивания и ожидания входящих запросов на соединение для класса StreamSocketListener не ограничено.

Настройка времени ожидания для операций с сокетами

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

События синхронизации времени JavaScript

  • setInterval() — многократно выполняет функцию в интервалы времени, указанные в миллисекундах.
  • setTimeout() — однократно выполняет функцию после ожидания в течение заданного количества миллисекунд.

Функции событий синхронизации времени реализуются в оконном объекте HTML DOM.

Пространство имен WinJS предоставляет особые возможности библиотеки Windows для JavaScript, которая включает объект WinJS.Promise. Метод timeout(timeout, promise) создает программу-оболочку для функции setTimeout. Метод timeout(timeout, promise) может быть использован приложением Магазина Windows, чтобы отменить заказ, если он не был завершен за количество миллисекунд, заданное в параметре timeout. Метод timeout(timeout, promise) может быть вызван с помощью операции сокета в качестве параметра promise, чтобы задать время ожидания операции, если она не была завершена в течение интервала, заданного параметром timeout. Если операция сокета находится в режиме ожидания, ее можно отменить.

Объект WinJS.Promise и метод timeout(timeout, promise) можно использовать с любыми асинхронными операциями в приложении среды выполнения Windows, включая все асинхронные операции сокета. Для обычного завершения можно добавить .then после вызова метода timeout(timeout, promise).

Базовая модель использования времени ожидания одинакова для всех трех классов. Далее для примера используется операция соединения в StreamSocket. Эту же модель можно использовать для реализации времени ожидания при отправке или получении сетевых данных с помощью объекта DatagramSocket или StreamSocket, а также при прослушивании входящих соединений с помощью объекта StreamSocketListener.

  • Создайте элемент управления StreamSocket.
  • Вызовите метод timeout(timeout, promise) и укажите один из методов StreamSocket.connectAsync в качестве параметра promise.
  • В конце исходного кода добавьте метод .then(successFunction, errorFunction) для обработки успешных выполнений и ошибок.
  • При ошибке закройте сокет. Как только заказ операции StreamSocket будет отменен, StreamSocket, который был отменен, не сможет больше использоваться.

В следующем примере реализуется настраиваемое время ожидания для операции подключения StreamSocket.


var clientSocket = null;
var timeout = 10000; // 10 seconds
function openClient() {
    var serverHostName = new Windows.Networking.HostName("www.contoso.com");
    var serviceName = "http";
 
    // displayStatus("Client: connection started.");
    clientSocket = new Windows.Networking.Sockets.StreamSocket();
    //var promise = clientSocket.connectAsync(serverHostName, serviceName)
    WinJS.Promise.timeout(timeout, clientSocket.connectAsync(serverHostName, serviceName).then(function () {
        // displayStatus("Client: connection completed.");
        // Do your socket operations here.
 
    }, function (reason) {
        // There are many reasons for this failure: the promise might have 
        // timed out, or the server host refused the connection, or there
        // was an TCP issue, or several other possibilities.
 
        // displayStatus("Client: connection failed. ");
        // displayStatus(reason.message);
        clientSocket.close();
        clientSocket = null;
    }
    ));
}

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

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

Подключение с помощью сокетов

Подключение с помощью сокета датаграмм

Подключение с помощью сокета потока

Защита соединений сокетов с использованием TLS/SSL

Ссылки

DatagramSocket

StreamSocket

StreamSocketListener

timeout(timeout, promise)

Windows.Networking.Sockets

WinJS

WinJS.Promise

Примеры

Пример Promise