소켓 작업에 시간 제한을 설정하는 방법(HTML)

[ 이 문서는 Windows 런타임 앱을 작성하는 Windows에서 8.x 및 Windows Phone 8.x 개발자를 대상으로 합니다. Windows 10용으로 개발하는 경우에는 최신 설명서를 참조하세요.]

이 항목에서는 Windows 런타임 앱에서 네트워크 소켓 작업에 시간 제한을 설정하여 작업이 완료될 때까지 대기하는 시간을 제한하는 방법을 보여 줍니다.

알아야 할 사항

기술

사전 요구 사항

  • 다음 정보는 네트워크 연결에 소켓을 사용하는 모든 연결된 Windows 런타임 앱 또는 네트워크 인식 Windows 런타임 앱에 적용됩니다. 이 항목은 Windows 8.1, Windows Phone 8.1 및 Windows Server 2012에서 JavaScript로 작성된 앱에 적용됩니다.

  • 이 항목의 다음 예제는 JavaScript로 제공됩니다. 소켓을 기본적으로 이해하고 있는 것이 좋습니다.

지침

소켓 작업의 기본 시간 제한에 대한 개요

StreamSocket 클래스는 Windows 런타임 앱에서 TCP 소켓을 구현합니다. TCP 소켓에서 네트워크 데이터를 보내거나 받을 수 있으려면 먼저 연결을 설정해야 합니다. Windows 8.1, Windows Phone 8.1 및 Windows Server 2012의 기본 TCP 소켓 구현에서는 TCP 연결 소켓 작업에 대한 기본 시간 제한을 설정합니다. 호스트 이름이나 끝점을 사용하는 경우 각 원본 및 대상 주소 쌍에 대한 기본 시간 제한은 3분(180초)입니다. 따라서 대상 호스트 이름에 두 개의 IP 주소가 있으면 약 6분이 경과된 다음에야 연결 작업 시간이 초과됩니다. 이 기본 시간 제한은 Windows 런타임 앱을 사용하는 고객 환경에 비해 너무 많을 수 있습니다. 따라서 StreamSocket 클래스를 사용하는 앱에서는 스트림 소켓 연결 작업에 대해 더 짧은 사용자 지정 시간 제한을 설정할 수 있습니다.

DatagramSocketStreamSocket 클래스에는 네트워크 데이터를 보내거나 받을 때 기본 시간 제한이 없습니다. 따라서 모든 보내기 또는 받기 작업이 계속 대기하게 됩니다. 소켓을 사용하는 Windows 런타임 앱에서는 보다 나은 고객 환경을 위해 이러한 작업에 시간 제한을 설정할 수 있습니다.

StreamSocketListener 클래스는 들어오는 연결 요청을 무한 수신 대기합니다.

소켓 작업에 사용자 지정 시간 제한을 설정하는 방법

JavaScript 언어는 지정된 시간 간격으로 일부 코드를 실행할 수 있도록 하는 타이밍 이벤트를 지원합니다.

JavaScript 타이밍 이벤트

  • setInterval() - 밀리초 단위로 지정된 시간 간격으로 반복적으로 함수를 실행합니다.
  • setTimeout() - 지정된 시간(밀리초) 동안 대기한 후 한 번 함수를 실행합니다.

타이밍 이벤트 함수는 HTML DOM Window 개체에서 구현됩니다.

WinJS 네임스페이스는 WinJS.Promise 개체를 포함하는 특수 JavaScript용 Windows 라이브러리 기능을 제공합니다. timeout(timeout, promise) 메서드는 setTimeout 함수를 래핑합니다. timeout(timeout, promise) 메서드는 Windows 스토어 앱에서 timeout 매개 변수에 지정된 시간(밀리초)까지 완료하지 못한 경우 promise를 취소하는 데 사용할 수 있습니다. timeout(timeout, promise) 메서드는 소켓 작업과 함께 promise 매개 변수로 호출하여 timeout 매개 변수로 지정한 간격 내에 완료하지 못한 경우 작업 시간을 제한할 수 있습니다. 소켓 작업은 작업이 계속 보류 중인 한 취소할 수 있습니다.

WinJS.Promise 개체 및 timeout(timeout, promise) 메서드는 모든 비동기 소켓 작업을 비롯하여 Windows 런타임 앱의 모든 비동기 작업에 사용할 수 있습니다. 정상적으로 완료하려면 timeout(timeout, promise) 메서드 호출 뒤에 ".then"을 추가할 수 있습니다.

시간 제한을 사용하는 기본 모델은 세 가지 클래스에 대해 모두 동일합니다. 아래 설명에서는 StreamSocket의 연결 작업을 예로 사용합니다. DatagramSocket 또는 StreamSocket 개체를 사용하여 네트워크 데이터를 보내거나 받을 때 또는 StreamSocketListener 개체를 사용하여 들어오는 연결을 수신 대기할 때 동일한 모델을 사용하여 시간 제한을 구현할 수 있습니다.

  • StreamSocket을 만듭니다.
  • StreamSocket.connectAsync 메서드 중 하나를 promise 매개 변수로 사용하여 timeout(timeout, promise) 메서드를 호출합니다.
  • .then(successFunction, errorFunction) 메서드를 추가하여 성공 및 오류를 처리하고 원본 코드를 완료합니다.
  • 오류 시 소켓을 닫습니다. StreamSocket 작업 promise가 취소되면 취소된 StreamSocket을 더 이상 사용할 수 없습니다.

다음 샘플에서는 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;
    }
    ));
}

관련 항목

기타

소켓을 사용하여 연결

데이터그램 소켓을 사용하여 연결하는 방법

스트림 소켓을 사용하여 연결하는 방법

TLS/SSL을 통해 소켓 연결의 보안을 유지하는 방법

참조

DatagramSocket

StreamSocket

StreamSocketListener

timeout(timeout, promise)

Windows.Networking.Sockets

WinJS

WinJS.Promise

샘플

Promise 샘플