Como definir tempos limite em operações de soquete (HTML)

[ Este artigo destina-se aos desenvolvedores do Windows 8.x e do Windows Phone 8.x que escrevem aplicativos do Windows Runtime. Se você estiver desenvolvendo para o Windows 10, consulte documentação mais recente]

Este tópico mostra como definir tempos limites em operações de soquete de rede em um aplicativo do Tempo de Execução do Windows de forma a limitar o tempo de espera pela conclusão de uma operação.

O que você precisa saber

Tecnologias

Pré-requisitos

  • As informações a seguir se aplicam a qualquer aplicativo do Tempo de Execução do Windows conectado ou com reconhecimento de rede que precisa usar soquetes para conexões de rede. Este tópico se aplica a aplicativos escritos em JavaScript no Windows 8.1, no Windows Phone 8.1 e no Windows Server 2012.

  • Os exemplos seguintes neste tópico são fornecidos em JavaScript. Recomendamos conhecimento básico sobre soquetes.

Instruções

Visão geral de tempos limites padrão em operações de soquetes

A classe StreamSocket implementa um soquete TCP em um aplicativo do Tempo de Execução do Windows. Um soquete TCP deve estabelecer uma conexão antes que dados de rede possam ser enviados ou recebidos. A implementação de soquete TCP subjacente no Windows 8.1, no Windows Phone 8.1 e no Windows Server 2012 define um tempo limite padrão em qualquer operação de soquete de conexão TCP. O tempo limite padrão é de 3 minutos (180 segundos) para cada par de endereços de origem e de destino quando nomes de host ou pontos de extremidade são usados. Portanto, se um nome de host de destino tiver dois endereços IP, a operação de conexão só atingirá o tempo limite depois de decorridos 6 minutos. Esse tempo limite padrão pode ser excessivo para a experiência do cliente com um aplicativo do Tempo de Execução do Windows. Portanto, um aplicativo que usa a classe StreamSocket pode querer definir um tempo limite personalizado mais curto em operações de conexão de soquete de fluxo.

As classes DatagramSocket e StreamSocket não têm tempos limites padrão durante o envio ou o recebimento de dados de rede. Portanto, qualquer operação de envio ou recebimento irá aguardar para sempre. Um aplicativo do Tempo de Execução do Windows que usa soquetes pode querer definir um tempo limite nessas operações para proporcionar uma experiência do cliente melhor.

A classe StreamSocketListener ouvirá e aguardará para sempre à espera de solicitações de conexão de entrada.

Como definir tempos limites personalizados em operações de soquetes

A linguagem JavaScript oferece suporte a eventos de temporização que possibilitam a execução de um código em intervalos de tempo especificados.

Eventos de temporização JavaScript

  • setInterval() - Executa uma função repetidamente em intervalos de tempo especificados em milissegundos.
  • setTimeout() - Executa uma função uma vez depois de aguardar um número de milissegundos especificado.

As funções de eventos de temporização são implementadas no objeto Window DOM HTML.

O namespace WinJS fornece recursos especiais da Biblioteca do Windows para JavaScript, que inclui um objeto WinJS.Promise. O método timeout(timeout, promise) envolve a função setTimeout. O método timeout(timeout, promise) pode ser usado por um aplicativo da Windows Store para cancelar uma promessa caso ele não tenha terminado até o número de milissegundos especificado no parâmetro timeout. O método timeout(timeout, promise) pode ser chamado com uma operação de soquete como o parâmetro promise para fazer com que a operação atinja o tempo limite caso ela não tenha sido concluída dentro do intervalo especificado pelo parâmetro timeout. A operação de soquete pode ser cancelada enquanto ela ainda está pendente.

O objeto WinJS.Promise e o método timeout(timeout, promise) podem ser usados com qualquer uma das operações assíncronas em um aplicativo do Tempo de Execução do Windows, incluindo todas as operações de soquete assíncronas. Você pode adicionar “.then” após a chamada do método timeout(timeout, promise) para suas conclusões normais.

O modelo básico para usar tempos limites é o mesmo para as três classes. A discussão a seguir usa uma operação de conexão em StreamSocket como exemplo. O mesmo modelo pode ser usado para implementar tempos limites durante o envio ou o recebimento de dados com o objeto DatagramSocket ou StreamSocket ou durante uma escuta em busca de conexões de entrada com um objeto StreamSocketListener.

  • Crie um StreamSocket.
  • Chame o método timeout(timeout, promise) com um dos métodos StreamSocket.connectAsync como o parâmetro promise.
  • Finalize o código-fonte adicionando um método .then(successFunction, errorFunction) para lidar com casos de êxito e erro.
  • No caso de um erro, feche o soquete. Quando uma promessa de operação StreamSocket é cancelada, o StreamSocket que foi cancelado não pode mais ser usado.

A amostra a seguir implementa um tempo limite personalizado em uma operação de conexão 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;
    }
    ));
}

Tópicos relacionados

Outro

Conectando-se com soquetes

Como conectar-se com um soquete de datagrama

Como conectar-se a um soquete de fluxo

Como proteger conexões de soquete com TLS/SSL

Referência

DatagramSocket

StreamSocket

StreamSocketListener

timeout(timeout, promise)

Windows.Networking.Sockets

WinJS

WinJS.Promise

Exemplos

Amostra de promessa