Come impostare i timeout nelle operazioni socket (HTML)
[ Questo articolo è rivolto agli sviluppatori per Windows 8.x e Windows Phone 8.x che realizzano app di Windows Runtime. Gli sviluppatori che usano Windows 10 possono vedere Documentazione aggiornata ]
Questo argomento illustra come impostare i timeout nelle operazioni socket di rete di un'app di Windows Runtime allo scopo di limitare il tempo di attesa prima che venga portata a termine l'operazione.
Cosa sapere
Tecnologie
-
Consente la comunicazione in rete mediante socket e WebSocket.
Prerequisiti
Le informazioni seguenti si applicano a qualsiasi app di Windows Runtime connessa o in grado di riconoscere la rete che usa i socket per stabilire connessioni di rete. Questo argomento riguarda le app scritte in JavaScript su Windows 8.1, Windows Phone 8.1 e Windows Server 2012.
Gli esempi contenuti in questo argomento sono scritti in JavaScript. È consigliabile una conoscenza di base dei socket.
Istruzioni
Panoramica dei timeout predefiniti nelle operazioni socket
La classe StreamSocket implementa un socket TCP in un'app di Windows Runtime. Prima che si possano inviare o ricevere dati di rete, è necessario che un socket TCP stabilisca una connessione. L'implementazione del socket TCP sottostante in Windows 8.1, Windows Phone 8.1 e Windows Server 2012 imposta un timeout predefinito su qualsiasi operazione socket di connessione TCP. Il timeout predefinito è di 3 minuti (180 secondi) per ciascuna coppia di indirizzi, di origine e di destinazione, quando si usano nomi host o endpoint. Perciò, se il nome host di una destinazione presenta due indirizzi IP, il timeout dell'operazione di connessione avverrà solo dopo 6 minuti circa. Dal punto di vista dell'esperienza utente con un app di Windows Runtime questo valore di timeout predefinito potrebbe essere troppo alto. È quindi possibile che un'app che utilizza la classe StreamSocket desideri impostare un timeout personalizzato più breve per le operazioni di connessione tramite socket di flusso.
Le classi DatagramSocket e StreamSocket non hanno valori di timeout predefiniti per l'invio o la ricezione di dati di rete. Perciò qualsiasi operazione di invio o di ricezione avrà un'attesa infinita. Per migliorare l'esperienza utente è possibile che un'app di Windows Runtime che usa i socket desideri impostare un timeout per queste operazioni.
La classe StreamSocketListener ascolta e attende all'infinito le richieste di connessione in entrata.
Come impostare i timeout personalizzati nelle operazioni socket
Il linguaggio JavaScript supporta gli eventi di tempo che consentono di eseguire codice a intervalli di tempo specificati.
Eventi di tempo in JavaScript
- setInterval() - Esegue ripetutamente una funzione a intervalli di tempo specificati espressi in millisecondi.
- setTimeout() - Esegue una funzione una volta dopo aver atteso il numero di millisecondi specificato.
Le funzioni dell'evento di tempo sono implementate nell'oggetto HTML DOM Window.
Lo spazio dei nomi WinJS offre speciali funzionalità della libreria Windows per JavaScript che include un oggetto WinJS.Promise. Il metodo timeout(timeout, promise) esegue il wrapping della funzione setTimeout. Il metodo timeout(timeout, promise) può essere utilizzato da un'app di Windows Store per annullare una promessa che non sia stata portata a termine dopo che sono trascorsi i millisecondi specificati nel parametro timeout. Si può chiamare il metodo timeout(timeout, promise) con un'operazione socket come parametro promise per il timeout dell'operazione se questa non viene portata a termine entro l'intervallo specificato dal parametro timeout. L'operazione socket può essere annullata fintanto che l'operazione è ancora in sospeso.
In un'app di Windows Runtime l'oggetto WinJS.Promise e il metodo timeout(timeout, promise) si possono usare con qualsiasi operazione asincrona, incluse tutte le operazioni socket asincrone. Dopo la chiamata del metodo timeout(timeout, promise) relativo ai normali completamenti puoi aggiungere ".then".
Il modello di base per l'uso dei timeout è identico per le tre classi. Di seguito viene usata come esempio un'operazione di connessione su StreamSocket. Si può utilizzare lo stesso modello per implementare i timeout durante l'invio o la ricezione di dati di rete con l'oggetto DatagramSocket o StreamSocket o durante l'ascolto delle connessioni in ingresso con un oggetto StreamSocketListener.
- Crea uno StreamSocket.
- Chiama il metodo timeout(timeout, promise) con uno dei metodi StreamSocket.connectAsync come parametro promise.
- Termina il codice sorgente con l'aggiunta di un metodo .then(successFunction, errorFunction) per la gestione sia delle operazioni che si sono concluse correttamente che dei casi di errore.
- In caso di errore, chiudi il socket. Dopo che la promessa di un'operazione StreamSocket è stata annullata, non sarà più possibile usare lo StreamSocket annullato.
L'esempio che segue implementa un timeout personalizzato su un'operazione di connessione 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;
}
));
}
Argomenti correlati
Altro
Come connettersi con un socket di datagramma
Come connettersi con un socket di flusso
Come proteggere le connessioni socket con TLS/SSL
Riferimento
Esempi