Compartir a través de


Cómo establecer tiempos de espera en operaciones de socket (HTML)

[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows en tiempo de ejecución. Si estás desarrollando para Windows 10, consulta la documentación más reciente

En este tema se muestra cómo establecer tiempos de espera en operaciones de sockets de red en una aplicación de Windows en tiempo de ejecución 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 Windows en tiempo de ejecución conectada o que esté preparada para una red que usa sockets para las conexiones de red. Este tema es válido para las aplicaciones escritas en JavaScript y HTML en Windows 8.1, Windows Phone 8.1 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 Windows en tiempo de ejecución. 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.1, Windows Phone 8.1 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 usan 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 Windows en tiempo de ejecución. 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 Windows en tiempo de ejecución 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 Windows en tiempo de ejecución, 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

Cómo conectarse con un socket de datagramas

Cómo conectarse a un socket de secuencias

Cómo proteger conexiones de sockets con TLS/SSL

Referencia

DatagramSocket

StreamSocket

StreamSocketListener

timeout(timeout, promise)

Windows.Networking.Sockets

WinJS

WinJS.Promise

Muestras

Muestra de compromiso