Aplicaciones de Windows
Contraer la tabla de contenido
Expandir la tabla de contenido

Cómo establecer tiempos de espera en las operaciones de sockets (aplicaciones de la Tienda Windows con JavaScript y HTML)

En este tema se muestra cómo establecer tiempos de espera en operaciones de sockets de red en una aplicación de la Tienda Windows para limitar el tiempo que se esperará a que finalice una operación.

Lo que debes saber

Tecnologías

Requisitos previos

  • La siguiente información es válida para cualquier aplicación de la Tienda Windows conectada o que esté preparada para una red que usa sockets para las conexiones de red. Este tema se aplica a las aplicaciones escritas en JavaScript en Windows 8 y Windows Server 2012.

  • Los siguientes ejemplos de este tema se proporcionan en JavaScript. Se recomienda tener un conocimiento básico sobre sockets.

Instrucciones

Introducción a los tiempos de espera predeterminados en operaciones de sockets

La clase StreamSocket implementa un socket TCP en una aplicación de la Tienda Windows. Un socket TCP debe establecer una conexión antes de poder enviar o recibir datos de red. La implementación de socket TCP subyacente en Windows 8 y Windows Server 2012 establece un tiempo de espera predeterminado en todas las operaciones de conexión de socket TCP. El tiempo de espera predeterminado es 3 minutos (180 segundos) por cada par de direcciones de origen y destino cuando se utilizan nombres de host o extremos. Por lo tanto, si el nombre de host de destino tiene dos direcciones IP, el tiempo de espera de la operación de conexión sería de 6 minutos. Este tiempo de espera predeterminado podría ser demasiado largo para la experiencia del usuario que usa una aplicación de la Tienda Windows. Por lo tanto, es posible que una aplicación que usa la clase StreamSocket quiera establecer un tiempo de espera menor en operaciones de conexión de socket de secuencias.

Las clases DatagramSocket y StreamSocket no tienen tiempos de espera predeterminados a la hora de enviar o recibir datos de red. Por lo tanto, las operaciones de envío o recepción esperarán indefinidamente. Es posible que una aplicación de la Tienda Windows que usa sockets quiera establecer un tiempo de espera en estas operaciones para mejorar la experiencia del usuario.

La clase StreamSocketListener escuchará y esperará indefinidamente las solicitudes de conexión entrantes.

Cómo establecer tiempos de espera personalizados en operaciones de socket

El lenguaje JavaScript admite eventos de temporización que permiten ejecutar código en intervalos de tiempo especificados.

Eventos de temporización de JavaScript

  • setInterval(): ejecuta una función repetidamente en intervalos de tiempo especificados de milisegundos.
  • setTimeout(): ejecuta una función una vez después de esperar el número de milisegundos especificado.
Las funciones de eventos de temporización se implementan en el objeto Window del DOM de HTML.

El espacio de nombres WinJS proporciona una biblioteca de Windows especial para las características de JavaScript que incluye un objeto WinJS.Promise. El método timeout(timeout, promise) encapsula la función setTimeout. Una aplicación de la Tienda Windows puede usar el método timeout(timeout, promise) para cancelar un compromiso si no ha finalizado en el número de milisegundos especificado en el parámetro timeout. El método timeout(timeout, promise) se puede invocar con una operación de socket como parámetro promise para agotar el tiempo de espera de la operación si no ha finalizado en el intervalo especificado por el parámetro timeout. La operación de socket se puede cancelar siempre que la operación esté aún pendiente.

El objeto WinJS.Promise y el método timeout(timeout, promise) se pueden usar con cualquiera de las operaciones asincrónicas en una aplicación de la Tienda Windows, incluidas todas las operaciones de socket asincrónicas. Puedes agregar “.then” después de la llamada al método timeout(timeout, promise) para las finalizaciones normales.

El modelo básico para usar tiempos de espera es el mismo para las tres clases. La siguiente explicación usa una operación de conexión en un StreamSocket como ejemplo. El mismo modelo se puede usar para implementar tiempos de espera cuando se envían o se reciben datos con el objeto DatagramSocket o StreamSocket, o cuando se escuchan las conexiones entrantes con un objeto StreamSocketListener.

  • Crea un StreamSocket.
  • Llama al método timeout(timeout, promise) con uno de los métodos StreamSocket.connectAsync como parámetro promise.
  • Finaliza el código fuente agregando un método .then(successFunction, errorFunction) para controlar correctamente los casos correctos e incorrectos.
  • En caso de error, cierra el socket. Después de cancelar un compromiso de operación StreamSocket, no se puede volver a usar el StreamSocket que se canceló.

El ejemplo siguiente implementa un tiempo de espera personalizado en una operación de conexión 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;
    }
    ));
}


Temas relacionados

Otros
Conexión con sockets
Conexión con sockets (aplicaciones de la Tienda Windows con C#/VB/C++ y XAML)
Cómo proteger conexiones de sockets con TLS/SSL
Inicio rápido: conectar con un socket de secuencias
Inicio rápido: conectar con un socket de datagramas
Referencia
DatagramSocket
StreamSocket
StreamSocketListener
timeout(timeout, promise)
Windows.Networking.Sockets
WinJS
WinJS.Promise
Muestras
Muestra de compromiso

 

 

Mostrar:
© 2018 Microsoft