Share via


Comment définir des délais d’attente sur les opérations de socket (HTML)

[ Cet article est destiné aux développeurs de Windows 8.x et Windows Phone 8.x qui créent des applications Windows Runtime. Si vous développez une application pour Windows 10, voir la Documentation ]

Cette rubrique montre comment définir des délais d’attente sur des opérations de socket réseau dans une application Windows Runtime pour limiter la durée pendant laquelle il convient d’attendre qu’une opération se termine.

Ce que vous devez savoir

Technologies

Prérequis

  • Les informations suivantes concernent les applications Windows Runtime connectées ou réseau qui utilisent des sockets pour les connexions réseau. Cette rubrique concerne les applications écrites en JavaScript dans Windows 8.1, Windows Phone 8.1 et Windows Server 2012.

  • Les exemples suivants fournis dans cette rubrique sont en langage JavaScript. Des connaissances de base sur les sockets sont recommandées.

Instructions

Vue d’ensemble des délais d’attente par défaut sur les opérations de socket

La classe StreamSocket implémente un socket TCP dans une application Windows Runtime. Un socket TCP doit établir une connexion pour que des données réseau puissent être envoyées ou reçues. L’implémentation sous-jacente du socket TCP dans Windows 8.1, Windows Phone 8.1 et Windows Server 2012 définit un délai d’attente par défaut sur toutes les opérations de connexion de socket TCP. Le délai d’attente par défaut est de 3 minutes (180 secondes) pour chaque paire d’adresses source et de destination lorsque des noms d’hôtes ou des points de terminaison sont utilisés. Par conséquent, si un nom d’hôte de destination possède deux adresses IP, l’opération de connexion n’expirera pas avant qu’environ 6 minutes se soient écoulées. Ce délai d’attente par défaut peut s’avérer excessif pour l’expérience utilisateur avec une application Windows Runtime. Ainsi, une application utilisant la classe StreamSocket pourra définir un délai d’attente personnalisé plus court sur les opérations de connexion de socket de flux.

Les classes DatagramSocket et StreamSocket ne possèdent aucun délai d’attente par défaut lors de l’envoi ou de la réception de données réseau. Ainsi, toute opération d’envoi ou de réception attendra de façon illimitée. Une application Windows Runtime utilisant des sockets pourra définir un délai d’attente sur ces opérations pour améliorer l’expérience utilisateur.

La classe StreamSocketListener écoutera et attendra de façon illimitée des demandes de connexion entrantes.

Comment définir des délais d’attente personnalisés sur les opérations de socket

Le langage JavaScript prend en charge les événements de temps qui permettent d’exécuter du code à des intervalles de temps donnés.

Événements de temps JavaScript

  • setInterval() : exécute une fonction de façon répétée à des intervalles de temps donnés en millisecondes.
  • setTimeout() : exécute une fonction une seule fois après avoir attendu le nombre de millisecondes spécifié.

Les fonctions d’événement de temps sont implémentées dans l’objet HTML DOM Window.

L’espace de noms WinJS fournit une bibliothèque Windows spéciale pour les fonctionnalités JavaScript, qui inclut un objet WinJS.Promise. La méthode timeout(timeout, promise) enveloppe la fonction setTimeout. La méthode timeout(timeout, promise) peut être utilisée par une application du Windows Store pour annuler une promesse si elle ne s’est pas terminée après le nombre de millisecondes spécifié dans le paramètre timeout. La méthode timeout(timeout, promise) peut être appelée avec une opération de socket en tant que paramètre promise pour que l’opération expire si elle ne s’est pas terminée dans l’intervalle spécifié par le paramètre timeout. L’opération de socket est capable d’être annulée tant que l’opération est encore en attente.

L’objet WinJS.Promise et la méthode timeout(timeout, promise) peuvent être utilisés avec n’importe laquelle des opérations asynchrones dans une application Windows Runtime, y compris avec toutes les opérations de socket asynchrones. Vous pouvez ajouter « .then » après l’appel à la méthode timeout(timeout, promise) pour des fins normales.

Le modèle de base pour l’utilisation des délais d’attente est le même pour les trois classes. Une opération de connexion sur un StreamSocket est utilisé comme exemple dans la discussion ci-dessous. Le même modèle peut être utilisé pour implémenter des délais d’attente lors de l’envoi ou de la réception de données réseau avec l’objet DatagramSocket ou StreamSocket ou lorsque vous écoutez les connexions entrantes avec un objet StreamSocketListener.

  • Créez un objet StreamSocket.
  • Appelez la méthode timeout(timeout, promise) avec l’une des méthodes StreamSocket.connectAsync comme paramètre promise.
  • Terminez le code source en ajoutant une méthode .then(successFunction, errorFunction) pour gérer les cas de réussite et d’erreur.
  • En cas d’erreur, fermez le socket. Une fois qu’une promesse d’opération StreamSocket est annulée, l’objet StreamSocket qui a été annulé ne peut plus être utilisé.

L’exemple suivant implémente un délai d’attente personnalisé sur une opération de connexion 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;
    }
    ));
}

Rubriques associées

Autre

Connexion à l’aide de sockets

Comment établir une connexion à l’aide d’un socket datagramme

Comment établir une connexion à l’aide d’un socket de flux

Comment sécuriser des connexions de socket avec TLS/SSL

Référence

DatagramSocket

StreamSocket

StreamSocketListener

timeout(timeout, promise)

Windows.Networking.Sockets

WinJS

WinJS.Promise

Exemples

Exemple de promesse