Freigeben über


So wird’s gemacht: Festlegen von Timeouts für Socketvorgänge (HTML)

[ Dieser Artikel richtet sich an Windows 8.x- und Windows Phone 8.x-Entwickler, die Windows-Runtime-Apps schreiben. Wenn Sie für Windows 10 entwickeln, finden Sie weitere Informationen unter neueste Dokumentation]

In diesem Thema wird gezeigt, wie Timeouts für Netzwerksocketvorgänge in einer Windows-Runtime-App festgelegt werden, um die Wartezeit bis zum Abschluss eines Vorgangs zu begrenzen.

Wissenswertes

Technologien

Voraussetzungen

  • Die folgenden Informationen gelten für alle verbundenen oder netzwerkfähigen Windows-Runtime-Apps, die Sockets für Netzwerkverbindungen verwenden. Dieses Thema bezieht sich auf in JavaScript geschriebene Apps unter Windows 8.1, Windows Phone 8.1 und Windows Server 2012.

  • Die folgenden Beispiele in diesem Thema sind in JavaScript verfasst. Grundkenntnisse im Bereich Sockets werden empfohlen.

Anweisungen

Übersicht über Standardtimeouts für Socketvorgänge

Die StreamSocket-Klasse implementiert einen TCP-Socket in einer Windows-Runtime-App. Ein TCP-Socket muss eine Verbindung aufbauen, bevor Netzwerkdaten gesendet oder empfangen werden können. Die zugrunde liegende TCP-Socketimplementierung in Windows 8.1, Windows Phone 8.1 und Windows Server 2012 legt ein Standardtimeout für alle TCP-Socketverbindungsvorgänge fest. Das Standardtimeout beträgt 3 Minuten (180 Sekunden) für jedes Paar aus Quell- und Zieladresse, wenn Hostnamen oder Endpunkte verwendet werden. Wenn ein Zielhostname zwei IP-Adressen aufweist, tritt der Timeout für den Verbindungsvorgang erst nach ungefähr 6 Minuten ein. Dieses Standardtimeout kann für das konkrete Benutzererlebnis bei der Verwendung einer Windows-Runtime-App mitunter viel zu hoch sein. Für eine App, die die StreamSocket-Klasse verwendet, könnte es daher sinnvoll sein, ein niedrigeres, benutzerdefiniertes Timeout für Streamsocket-Verbindungsvorgänge festzulegen.

Für die Klassen DatagramSocket und StreamSocket gibt es kein Standardtimeout für das Senden oder Empfangen von Netzwerkdaten. Bei jedem Sende- oder Empfangsvorgang kann es somit zu einer unbegrenzten Wartezeit kommen. Für eine Windows-Runtime-App, die Sockets verwendet, kann es sich daher empfehlen, ein Timeout für diese Vorgänge festzulegen, um die Benutzerfreundlichkeit zu verbessern.

Die StreamSocketListener-Klasse lauscht und wartet für immer auf eingehende Verbindungsanforderungen.

Festlegen von benutzerdefinierten Timeouts für Socketvorgänge

JavaScript unterstützt Zeitereignisse, die es ermöglichen, bestimmten Code in definierten Zeitintervallen auszuführen.

JavaScript-Zeitereignisse

  • setInterval() – Führt eine Funktion wiederholt in bestimmten, in Millisekunden angegebenen Zeitintervallen aus.
  • setTimeout() – Führt eine Funktion einmal nach einer Wartezeit von einer angegebenen Anzahl von Millisekunden aus.

Die Zeitereignisfunktionen werden im Window-Objekt von HTML DOM implementiert.

Der WinJS-Namespace stellt besondere Features der Windows-Bibliothek für JavaScript bereit, die ein WinJS.Promise-Objekt einschließen. Die timeout(timeout, promise)-Methode kapselt die setTimeout-Funktion. Die timeout(timeout, promise)-Methode kann in einer Windows Store-App verwendet werden, um ein Zusage abzubrechen, falls diese nicht in der Anzahl an Millisekunden abgeschlossen wird, die im timeout-Parameter angegeben ist. Die timeout(timeout, promise)-Methode kann mit einem Socketvorgang als promise-Parameter aufgerufen werden, damit ein Timeout für den Vorgang eintritt, falls er nicht in dem Intervall abgeschlossen wird, der im timeout-Parameter angegeben ist. Ein Abbruch des Socketvorgangs ist so lange möglich, wie der Vorgang noch aussteht.

Das WinJS.Promise-Objekt und die timeout(timeout, promise)-Methode können mit jedem der asynchronen Vorgänge in einer Windows-Runtime-App verwendet werden, auch mit allen asynchronen Socketvorgängen. Sie können für normale Beendigungen ein ".then" nach dem timeout(timeout, promise)-Methodenaufruf hinzufügen.

Das Grundmodell für die Verwendung von Timeouts ist für alle drei Klassen gleich. In der folgenden Erläuterung wird exemplarisch ein Verbindungsvorgang für einen StreamSocket verwendet. Das gleiche Modell kann verwendet werden, um Timeouts zu implementieren, wenn Netzwerkdaten mit dem DatagramSocket- oder dem StreamSocket-Objekt gesendet oder empfangen werden oder wenn mit einem StreamSocketListener-Objekt auf eingehende Verbindungen gelauscht wird.

  • Erstellen Sie einen StreamSocket.
  • Rufen Sie die timeout(timeout, promise)-Methode mit einer der StreamSocket.connectAsync-Methoden als promise-Parameter auf.
  • Beenden Sie den Quellcode, indem Sie eine .then(successFunction, errorFunction)-Methode zum Behandeln von Erfolgs- und Fehlerfällen hinzufügen.
  • Bei einem Fehler soll der Socket geschlossen werden. Nach Abbruch einer StreamSocket-Vorgangszusage, kann der abgebrochene StreamSocket nicht mehr verwendet werden.

Im folgenden Beispiel wird ein benutzerdefiniertes Timeout für einen StreamSocket-Verbindungsvorgang implementiert.


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;
    }
    ));
}

Verwandte Themen

Sonstige

Verbinden mit Sockets

So wird's gemacht: Herstellen einer Verbindung mit einem Datagrammsocket

So wird's gemacht: Herstellen einer Verbindung mit einem Streamsocket

So wird's gemacht: Schützen von Socketverbindungen mit TLS/SSL

Referenz

DatagramSocket

StreamSocket

StreamSocketListener

timeout(timeout, promise)

Windows.Networking.Sockets

WinJS

WinJS.Promise

Beispiele

Beispiel für eine Zusage