共用方式為


如何在通訊端作業上設定逾時 (HTML)

[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]

本主題說明 如何在 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 語言l支援計時事件,因此可以在指定的時間間隔中執行某些程式碼。

JavaScript 計時事件

  • setInterval() - 在指定的時間間隔 (毫秒) 中重複執行函數。
  • setTimeout() - 等候指定的毫秒數後再執行函數一次。

計時事件函數實作於 HTML DOM Window 物件。

WinJS 命名空間為 JavaScript 功能提供了特別的 Windows Library,其中包含 WinJS.Promise 物件。timeout(timeout, promise) 方法包裝 setTimeout 函式。如果 promise 未在 timeout 參數中指定的毫秒數內完成,Windows 市集應用程式可使用 timeout(timeout, promise) 方法來取消 promise。 如果未在 timeout 參數中指定的間隔內完成,當 promise 參數要將作業逾時的時候,可以使用通訊端作業來呼叫 timeout(timeout, promise) 方法。只要作業持續擱置中,就能取消通訊端作業。

WinJS.Promise 物件與 timeout(timeout, promise) 方法可搭配使用 Windows 執行階段應用程式中所有的非同步作業,包含所有非同步通訊端作業。 您可在正常完成的 timeout(timeout, promise) 方法呼叫後新增 “.then”。

三個類別的基本模型使用的逾時都相同。 以下討論使用 StreamSocket 上的連線作業做為範例。當傳送或接收具有 DatagramSocketStreamSocket 物件的網路資料,或者接聽具有 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 範例