如何使用進階通訊端控制項 (HTML)
[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]
本主題說明 在 Windows 市集應用程式中使用 DatagramSocket、StreamSocket、StreamSocketListener 功能時,如何使用進階通訊端控制項。
您必須知道的事
技術
-
使用通訊端與 WebSocket 啟用網路通訊。
先決條件
- 這個主題的下列範例是使用 JavaScript 撰寫的。建議對通訊端有基本的了解。
進階控制項的概觀
DatagramSocket、StreamSocket 和 StreamSocketListener 類別全部都遵循使用進階控制項的相同模型。對應到上述每一個主要類別的是可以存取進階控制項的相關類別:
- DatagramSocketControl - 提供 DatagramSocket 物件的通訊端控制項資料。
- StreamSocketControl - 提供 StreamSocket 物件的通訊端控制項資料。
- StreamSocketListenerControl - 提供 StreamSocketListener 物件的通訊端控制項資料。
三個類別的基本模型使用的進階控制項都相同。 以下討論使用 StreamSocket 做為範例,但是相同程序也可搭配 DatagramSocket 或 StreamSocketListener 使用。
- 建立一個 StreamSocket。
- 使用 StreamSocket.Control 屬性來取得與 StreamSocket 物件關聯的 StreamSocketControl 執行個體。
- 在 StreamSocketControl 取得或設定屬性以設定進階通訊端選項。
應用程式必須一律先在 StreamSocketControl 設定屬性,才能發出連線作業或是繫結通訊端的作業。因此,最好在建立通訊端後,立即設定任何進階選項。請勿嘗試在通訊端呼叫其中一個 ConnectAsync 方法之後設定 StreamSocketControl 屬性。
資料包通訊端控制項
DatagramSocket 支援使用 UDP 資料包通訊端的網路通訊。 DatagramSocket 的進階選項僅限單一選項:
服務品質會影響在 DatagramSocket 物件上接收封包的執行緒優先順序。服務品質可以被設定成 SocketQualityOfService 列舉之兩個可能值的其中一個值。 建立DatagramSocket 時,normal 設定是預設值。 lowLatency 設定會增加接收封包的執行緒優先順序。這個選項通常只能用於音訊或是對於時間非常敏感的類似應用程式。
對於時間敏感的應用程式,下列範例會建立 DatagramSocket,並將 DatagramSocketControl.QualityOfService 設定成 lowLatency。完成此動作後,此應用程式即可在會繫結通訊端或連線通訊端的 DatagramSocket 呼叫其他方法。
var clientSocket = new Windows.Networking.Sockets.DatagramSocket();
// The control object is associated with the socket
// Get the current setting for quality of service
// This isn't needed, but it shows how to get the current setting
var currentSetting = clientSocket.Control.QualityOfService;
// Set quality of service to low latency
clientSocket.Control.QualityOfService = SocketQualityOfService.LowLatency;
// Now use the DatagramSocket to call:
// BindEndpointAsync, BindServiceNameAsync,
// ConnectAsync, GetOutputstreamAsync, or
// JoinMulticastGroup
StreamSocket 通訊端控制項
StreamSocket 支援使用 TCP 資料流通訊端的網路通訊。 在 StreamSocket 上有一些進階選項:
- StreamSocketControl.KeepAlive - 指出保持使用中封包是否已傳送至 StreamSocket 物件上的遠端目的地。
- StreamSocketControl.NoDelay - 指出在 StreamSocket 物件上是否使用 Nagle 演算法。
- StreamSocketControl.OutboundBufferSizeInBytes - 控制用來在 StreamSocket 物件上傳送資料的傳送緩衝區大小 (位元組)。
- StreamSocketControl.QualityOfService - StreamSocket 物件的服務品質。
在此範例中,我們將變更 StreamSocketControl.NoDelay 屬性,這個屬性控制是否啟用或停用 Nagle 演算法。
Nagle 演算法是一種改善 TCP/IP 網路效率的技術,所使用的方式是減少需要透過網路傳送的封包數目。 演算法嘗試處理重複以小區塊發出資料的應用程式所造成的問題。IPv4 的 TCP 封包 (無任何其他標頭選項) 具有 40 位元組的標頭 (IP 為 20 個位元組,而 TCP 也為 20 個位元組)。因此,如果應用程式只在一個封包中傳送 4 個位元組,則封包資料的負荷將非常大。 這可能發生在遠端存取通訊協定上 (例如 telnet 或安全殼層),其中大部分的 Keypress 可能只會產生會立即傳送的單一或兩個位元組的資料。在低速連結上,這些封包許多會同時透過網路轉送。Nagle 演算法的運作方式是將數個較小的傳出訊息結合在一起,然後一次傳送。如果有一個已傳送的封包,寄件者尚未收到認可,則寄件者會持續保持緩衝處理輸出,直到具有值得輸出的完整封包為止。這樣允許一次傳送輸出。套用 Nagle 演算法的影響是會增加頻寬,但導致延遲。一個設計良好的應用程式會在內部緩衝處理傳送,因此不需要使用 Nagle 演算法。
建立 StreamSocket 時的預設設定是將這個選項設定為 true 以停用 Nagle 演算法。此設定會在傳送較小的訊息時降低可能的延遲。不過,如果將 StreamSocket 用於傳送許多小型封包的應用程式,而且沒有延遲的問題時,則可以啟用 Nagle 演算法以改善效率。
下列範例會建立一個 StreamSocket,並將 StreamSocketControl.NoDelay 設定成 false。完成這個動作後,此應用程式即可在連線通訊端的 StreamSocket 呼叫其他方法。
var clientSocket = new Windows.Networking.Sockets.StreamSocket();
// The control object is associated with the socket
// Get the current setting for this option
// This isn't needed, but it shows how to get the current setting
var currentSetting = clientSocket.Control.NoDelay;
// Don't disable the nagle algorithm
clientSocket.Control.NoDelay = false;
// Now you can use the StreamSocket to call one of the
// ConnectAsync methods
StreamSocketListener 通訊端控制項
StreamSocketListener 支援利用 TCP 資料流通訊端接聽連入網路連線。StreamSocketListener 的進階選項僅限單一選項:
- StreamSocketListener.QualityOfService - StreamSocketListener 物件接收連線時,在建立的 StreamSocket 物件上要設定的服務品質。
服務品質會影響 StreamSocketListener 物件接收連線時所建立的 StreamSocket 物件,其接收封包的執行緒優先順序。服務品質可以被設定成 SocketQualityOfService 列舉之兩個可能值的其中一個值。 接收連線並建立StreamSocket 時,normal 設定是預設值。 lowLatency 設定會在建立 StreamSocket 時增加接收封包的執行緒優先順序。這個選項通常只能用於接受音訊的連線或是對於時間非常敏感的類似應用程式。
對於時間敏感的應用程式,下列範例會建立 StreamSocketListener,並將 StreamSocketListener.QualityOfService 設定成 lowLatency。完成這個動作後,此應用程式即可在 StreamSocketListener 呼叫其他方法,開始接聽連入連線要求。
var listenSocket = new Windows.Networking.Sockets.StreamSocketListener();
// The control object is associated with the socket
// Get the current setting for quality of service
// This isn't needed, but it shows how to get the current setting
var currentSetting = listenSocket.Control.QualityOfService;
// Set quality of service to low latency
listenSocket.Control.QualityOfService = SocketQualityOfService.LowLatency;
// Now you can use the StreamSocketListener to
// bind to a service name and begin listening for
// incoming connection requests
備註
除了控制資料之外,還有一組類似的相關類別,可存取這些主要類別的其他通訊端資訊:
- DatagramSocketInformation - 提供 DatagramSocket 物件的通訊端資訊。
- StreamSocketInformation - 提供 StreamSocket 物件的通訊端資訊。
- StreamSocketListenerInformation - 提供 StreamSocketListener 物件的通訊端資訊。
存取其他通訊端資訊的模型遵循與控制資料的存取權相同的設計方式。以下討論使用 StreamSocket 做為範例。
- 建立一個 StreamSocket。
- 使用 StreamSocket.Information 屬性來取得與 StreamSocket 物件關聯的 StreamSocketInformation 執行個體。
- 取得 StreamSocketInformation 執行個體的屬性以抓取其他通訊端資訊。
通訊端資訊與通訊端控制項類別之間有一項顯著的差異。在 StreamSocketControl 執行個體的屬性是可讀取或可寫入 (取得或設定)。相反的,在 StreamSocketInformation 執行個體上的屬性是唯讀 (取得)。應用程式可在建立 StreamSocket 之後,隨時在 StreamSocketControl 或 StreamSocketInformation 執行個體上抓取屬性值。不過,應用程式必須一律先在 StreamSocketControl 執行個體上設定屬性,才能發出連線作業或是繫結通訊端的作業。
相關主題
其他
參考